2010-02-03 13 views

Répondre

35

Utilisez Enumerable.Except et plus particulièrement la overload qui accepte un IEqualityComparer<MyType>:

var complement = c2.Except(c1, new MyTypeEqualityComparer()); 

Notez que ce produit la différence de jeu et donc des doublons dans c2 n'apparaîtra dans le résultat IEnumerable<MyType> une fois. Ici, vous devez mettre en œuvre IEqualityComparer<MyType> quelque chose comme

class MyTypeEqualityComparer : IEqualityComparer<MyType> { 
    public bool Equals(MyType x, MyType y) { 
     return x.Id.Equals(y.Id); 
    } 

    public int GetHashCode(MyType obj) { 
     return obj.Id.GetHashCode(); 
    } 
} 
3

Si vous utilisez C# 3.0 + Linq

var complement = from i2 in c2 
       where c1.FirstOrDefault(i1 => i2.Id == i1.Id) == null 
       select i2; 

itérer complément pour obtenir les articles

+1

Ceci utilisera des boucles imbriquées et est très inefficace. –

0
public class MyTypeComparer : IEqualityComparer<MyType> 
{ 
    public MyTypeComparer() 
    {  
    } 

    #region IComparer<MyType> Members 

    public bool Equals(MyType x, MyType y) 
    { 
     return string.Equals(x.Id, y.Id); 
    } 

    public int GetHashCode(MyType obj) 
    { 
     return base.GetHashCode(); 
    } 

    #endregion  
} 

puis en utilisant Linq

c3 collection = new collection().add(c1); 
c3.add(c2); 
var items = c3.Distinct(new MyTypeComparer()); 

Vous pouvez aussi le faire en utilisant des génériques et des prédicats. si vous avez besoin d'un échantillon, faites le moi savoir.

+1

ne sera pas distinct juste filtrer les doublons en vous laissant avec c1 union c2, au lieu de c1-c2? – luke