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

时间:2010-02-03 17:08:20

标签: c# .net linq complement set-operations

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

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

3 个答案:

答案 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());

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