У меня есть две коллекции (общие списки), назовем их ListA и ListB.
В ListA у меня есть несколько элементов типа A. В ListB у меня есть некоторые элементы типа B, которые имеют тот же идентификатор (но не тот же тип), что и элементы в ListA, а также многие другие. Я хочу удалить все элементы из ListB, которые имеют тот же идентификатор, что и в ListA. Как лучше всего это сделать? Подходит ли Linq для объектов? Какой алгоритм вы бы использовали?
Пример
ListA: ItemWithID1, ItemWithID2¨
ListB: ItemWithID1, ItemWithID2, ItemWithID3, ItemWithID4
Обновлено: я забыл упомянуть в своем исходном вопросе, что ListA и ListB не содержат одинаковых типов. Таким образом, единственный способ сравнить их - использовать свойство .Id. Что делает недействительными ответы, которые я получил до сих пор.





простой цикл:
for (item i: LISTA) {
removeItem(i, LISTB);
}
method removeItem(Item, List) {
for (Item i: List) {
if (Item == i)
List.removeItem(i);
}
}
Я не знаю, что это лучший вариант, но если вы удаляете все элементы ListA, которые находятся в ListB, просто перебирайте ListA и используя конструкцию if ListB.contains, удаляя ее из ListB.
Что-то вроде этого
foreach Object o in ListA
If ListB.contains(o)
ListB.remove(o)
Есть два варианта. Не уверен, какой из них быстрее.
listB.RemoveAll(listA.Contains);
foreach (string str in listA.Intersect(listB))
listB.Remove(str);
Что-то для справки, доступное с Библиотека общих коллекций C5 для .NET, - это метод RemoveAll, точно так же, как ранее указывал Тодд Уайт. Однако C5 также предлагает другой метод в своих интерфейсах, RetainAll, который выполняет функциональную противоположность RemoveAll в том, что, используя исходные списки авторов,
ListB.RetainAll(ListA) - это набор { Item1, Item2 }, тогда как ListB.RemoveAll(ListA) - это набор { Item3, Item4 }.
Я обнаружил, что лямбда-выражения идеально подходят. Вместо длинного метода linq to objects я мог бы сделать это всего за несколько строк с помощью лямбда:
foreach(TypeA objectA in listA){
listB.RemoveAll(objectB => objectB.Id == objectA.Id);
}
Я думаю, что лучше всего подходит метод Microserf
Большинство приведенных выше примеров относятся к ситуациям, когда два списка относятся к одному типу. Но если вы хотите сравнить идентификаторы разных типов и удалить их, лучше всего использовать Microserf.
Спасибо