У меня ObservableCollection a
и List b
Теперь я хочу удалить из коллекции a
элементы, у которых есть эквивалент в списке b
.
Мой код на данный момент:
public static void CrossRemove<TFirst, TSecond>(this ObservableCollection<TFirst> collection, IEnumerable<TSecond> secondCollection, Func<TFirst, TSecond, bool> predicate)
{
collection.Where(first => secondCollection.Any(second => predicate(first, second)))
.ToList().ForEach(item => collection.Remove(item));
}
использование:
ObservableCollection<string> first = new ObservableCollection<string> { "1", "2", "3", "4", "5", "6", "k" };
IEnumerable<int> second = new List<int> { 2, 3, 5 };
first.CrossRemove(second, (x, y) => x == y.ToString());
этот код удаляет «2», «3» и «5» из коллекции, оставляя «1», «4», «6» и «k».
В моем реальном коде a
и b
содержат элементы, унаследованные от того же interface
, и я сравниваю свойства, которые есть в этом интерфейсе, но я не могу воспользоваться этим.
Я не могу создать новый список, потому что он привязан к представлению wpf, и если я сделаю это вместо удаления элементов, будут видны сбои.
Есть ли лучший / более быстрый способ сделать это?