2010-03-08 22 views
10

estoy creando una clase que deriva de la lista ...Método igual de System.Collections.Generic.List <T> ...?

public class MyList : List<MyListItem> {}

hemos anulado Iguales de MyListItem ...

public override bool Equals(object obj) 
{ 
    MyListItem li = obj as MyListItem; 
    return (ID == li.ID); // ID is a property of MyListItem 
} 

me gustaría tener un método Equals también en el objeto MyList que comparará cada elemento de la lista, llamando a Equals() en cada objeto MyListItem.

Sería bueno llamar simplemente ...

MyList l1 = new MyList() { new MyListItem(1), new MyListItem(2) }; 
MyList l2 = new MyList() { new MyListItem(1), new MyListItem(2) }; 

if (l1 == l2) 
{ 
    ... 
} 

... y tienen las comparaciones de la lista realizada por valor.

¿Cuál es la mejor manera ...?

Respuesta

25

Puede usar el método SequenceEqual linq en la lista ya que su lista implementa IEnumerable. Esto verificará que todos los elementos sean iguales y estén en el mismo orden. Si el orden puede ser diferente, primero puede ordenar las listas.

0
public class MyList<T> : List<T> 
{ 
    public override bool Equals(object obj) 
    { 
     if (obj == null) 
      return false; 

     MyList<T> list = obj as MyList<T>; 
     if (list == null) 
      return false; 

     if (list.Count != this.Count) 
      return false; 

     bool same = true; 
     this.ForEach(thisItem => 
     { 
      if (same) 
      { 
       same = (null != list.FirstOrDefault(item => item.Equals(thisItem))); 
      } 
     }); 

     return same; 
    } 
} 
Cuestiones relacionadas