我有两个名为ICollection<MyType>
和c1
的{{1}}类型的集合。我想找到c2
中不在c2
中的项集,其中相等的启发式是c1
上的Id
属性。
在C#(3.0)中执行此操作的最快方法是什么?
答案 0 :(得分:36)
使用Enumerable.Except
,特别是接受IEqualityComparer<MyType>
的{{3}}:
var complement = c2.Except(c1, new MyTypeEqualityComparer());
请注意,这会产生设置差异,因此c2
中的重复项只会出现在结果IEnumerable<MyType>
中一次。在这里,您需要实现IEqualityComparer<MyType>
类似
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();
}
}
答案 1 :(得分:3)
如果使用C#3.0 + Linq:
var complement = from i2 in c2
where c1.FirstOrDefault(i1 => i2.Id == i1.Id) == null
select i2;
循环通过补充来获取物品。
答案 2 :(得分: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
}
然后,使用Linq:
c3 collection = new collection().add(c1);
c3.add(c2);
var items = c3.Distinct(new MyTypeComparer());
您也可以使用泛型和谓词来完成它。如果您需要样品,请告诉我。