27

我有两个ICollection<MyType>名为c1and的类型集合c2。我想找到 inc2而不是 in的一组项目c1,其中相等的启发式是Idon 的属性MyType

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

4

3 回答 3

39

使用Enumerable.Except,特别是接受一个的重载IEqualityComparer<MyType>

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();
    }
}
于 2010-02-03T17:13:15.660 回答
3

如果使用 C# 3.0 + Linq:

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

循环补码以获取项目。

于 2010-02-03T17:15:50.253 回答
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());

你也可以使用泛型和谓词来做到这一点。如果您需要样品,请告诉我。

于 2010-02-03T17:16:55.120 回答