Самый быстрый способ найти дополнение к двум коллекциям в С#
У меня есть две коллекции типа ICollection; c1 и c2. Я хотел бы найти набор элементов, которые находятся в c2, которые не находятся в c1, где эвристика для равенства - это свойство Id в MyType.
Каков самый быстрый способ выполнить это на С#.
Изменить: С# версия = 3.0
Ответы
Ответ 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());
Вы могли бы также сделать это с помощью дженериков и предикатов. если вам нужен образец, дайте мне знать.