Quickest way to find the complement of two collections in C#

元气小坏坏 提交于 2019-11-30 10:53:33

Use Enumerable.Except and specifically the overload that accepts an IEqualityComparer<MyType>:

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

Note that this produces the set difference and thus duplicates in c2 will only appear in the resulting IEnumerable<MyType> once. Here you need to implement IEqualityComparer<MyType> as something like

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();
    }
}
Alex LE

If using C# 3.0 + Linq:

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

Loop through complement to get the items.

FiveTools
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     
}

Then, using Linq:

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

You could also do it using generics and predicates. If you need a sample, let me know.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!