2010-03-08 7 views
10

Je crée une classe qui dérive de la liste ...Égal à la méthode de System.Collections.Generic.List <T> ...?

public class MyList : List<MyListItem> {}

J'ai surchargé Equals de MyListItem ...

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

Je voudrais avoir une méthode Equals dans l'objet MyList qui va comparer chaque élément de la liste, en appelant Equals() sur chaque objet MyListItem.

Il serait agréable d'appeler simplement ...

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

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

... et ont les comparaisons de la liste faite par valeur.

Quelle est la meilleure façon ...?

Répondre

25

Vous pouvez utiliser la méthode SequenceEqual linq dans la liste puisque votre liste implémente IEnumerable. Cela permettra de vérifier que tous les éléments sont identiques et dans le même ordre. Si la commande peut être différente, vous pouvez trier les listes en premier.

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; 
    } 
}