Вы можете использовать метод Except
:
public static void AddDistinct<T>(this ICollection<T> source, params ICollection<T>[] collections)
{
var itemsToAdd = collections.SelectMany(x => x).Where(predicate).Except(source).ToArray();
itemsToAdd.ForEach(source.Add));
}
public static void AddDistinct<T>(this ICollection<T> source, Func<T, bool> predicate, params ICollection<T>[] collections)
{
var itemsToAdd = collections.SelectMany(x => x).Where(predicate).Except(source).ToArray();
itemsToAdd.ForEach(source.Add));
}
public static void AddDistinct<T>(this ICollection<T> source, params T[] items)
{
var itemsToAdd = items.Except(source).ToArray();
itemsToAdd.ForEach(source.Add));
}
public static void AddDistinct<T>(this ICollection<T> source, Func<T, bool> predicate, params T[] items)
{
var itemsToAdd = items.Where(predicate).Except(source).ToArray();
itemsToAdd.ForEach(source.Add));
}
Обратите внимание, что поскольку Where
и Except
имеют отложенное и потоковое выполнение, вам необходим вызов ToArray()
, чтобы обеспечить перечисление source
завершено до того, как вы добавите к нему что-либо (поскольку коллекция не может быть изменена во время перечисления).