Подтвердить что ты не робот

Самый быстрый способ найти дополнение к двум коллекциям в С#

У меня есть две коллекции типа ICollection; c1 и c2. Я хотел бы найти набор элементов, которые находятся в c2, которые не находятся в c1, где эвристика для равенства - это свойство Id в MyType.

Каков самый быстрый способ выполнить это на С#.

Изменить: С# версия = 3.0

4b9b3361

Ответ 1

Используйте 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();
    }
}

Ответ 2

Если используется С# 3.0 + Linq

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

итерация для получения элементов

Ответ 3

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

Вы могли бы также сделать это с помощью дженериков и предикатов. если вам нужен образец, дайте мне знать.