2008-10-28 3 views
3

У меня есть две коллекции (общие списки), назовем их ListA и ListB.Удаление элементов из одной коллекции в другой коллекции

В ListA У меня есть несколько элементов типа A. В ListB У меня есть некоторые элементы типа B, у которых есть ИДЕННЫЙ ИДЕНТИФИКАТОР (но не тот же тип), что и элементы в ListA, и многие другие. Я хочу удалить все элементы из спискаB, которые имеют тот же идентификатор, что и в ListA. Каков наилучший способ сделать это? Является ли Linq объектами в хорошей форме? Какой алгоритм вы бы использовали?

Пример

lišta: ItemWithID1, ItemWithID2¨

LISTB: ItemWithID1, ItemWithID2, ItemWithID3, ItemWithID4

EDIT: Я забыл упомянуть в моем оригинальный вопрос, что lišta и LISTB не содержит те же типы. Таким образом, единственный способ сравнить их - через свойство .Id. Который делает недействительными ответы, которые я получил до сих пор.

ответ

3

Я обнаружил, что лямбда-выражения были идеальным сочетанием. Вместо длинного LINQ к методу объектов, я мог бы сделать это в несколько строк с лямбда:

foreach(TypeA objectA in listA){ 
    listB.RemoveAll(objectB => objectB.Id == objectA.Id); 
} 
0

простой цикл:

for (item i: LISTA) { 
    removeItem(i, LISTB); 
} 


method removeItem(Item, List) { 
    for (Item i: List) { 
     if (Item == i) 
      List.removeItem(i); 
    } 
} 
0

Я не знаю, что это самый лучший вариант, но если вы удаляете все элементы lišta, которые находятся в LISTB, просто итерация lišta и используя, если ListB.contains создайте, удалив его из ListB.

Что-то вроде этого

foreach Object o in ListA 
    If ListB.contains(o) 
    ListB.remove(o) 
12

Здесь два варианта. Не уверен, какой из них быстрее.

listB.RemoveAll(listA.Contains); 


foreach (string str in listA.Intersect(listB)) 
    listB.Remove(str); 
0

Что-то для справки, которая доступна с C5 Generic Collection Library для .NET является RemoveAll метод, так же, как указано Тодда Уайта раньше. Тем не менее, C5 также предлагает другой метод в своих интерфейсах, RetainAll который делает функциональную противоположность RemoveAll в том, что, используя списки оригинального автора,

ListB.RetainAll(ListA) является множеством { Item1, Item2 }, в то время как ListB.RemoveAll(ListA) есть множество { Item3, Item4 }.

1

Я думаю, что лучше всего подходит метод Microserf-х

Большинство примеров выше для ситуаций, два списка одного типа. Но если вы хотите сравнить разные типы Id и хотите удалить themn лучший способ, это путь Microserf.

С благодарностью