在C#中找到两个集合的补充的最快方法

我有两个类型ICollection集合,名为c1c2 。 我想找到c2中不在c1的项集,其中相等的启发式是MyType上的Id属性。

在C#(3.0)中执行此操作的最快方法是什么?

使用Enumerable.Except ,特别是接受IEqualityComparer的重载 :

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

请注意,这会产生设置差异,因此c2重复项只会出现在生成的IEnumerable一次。 在这里你需要实现IEqualityComparer

 class MyTypeEqualityComparer : IEqualityComparer { public bool Equals(MyType x, MyType y) { return x.Id.Equals(y.Id); } public int GetHashCode(MyType obj) { return obj.Id.GetHashCode(); } } 

如果使用C#3.0 + Linq:

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

循环通过补充来获取项目。

 public class MyTypeComparer : IEqualityComparer { public MyTypeComparer() { } #region IComparer Members public bool Equals(MyType x, MyType y) { return string.Equals(x.Id, y.Id); } public int GetHashCode(MyType obj) { return base.GetHashCode(); } #endregion } 

然后,使用Linq:

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

您也可以使用generics和谓词来完成它。 如果您需要样品,请告诉我。