Próbuję wymyślić, jak przejrzeć ogólną listę elementów, które chcę usunąć z innej listy elementów.
Powiedzmy, że mam to jako hipotetyczny przykład
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Chcę przejść listę 1 z foreach i usunąć każdy element z Listy 1, który jest również zawarty w Liście 2.
Nie jestem do końca pewien, jak to zrobić, ponieważ foreach nie jest oparty na indeksach.
list1
które istnieją wlist2
, czy chcesz usunąć elementy,list2
które istnieją wlist1
? W momencie tego komentarza każda podana odpowiedź wykona to drugie.Odpowiedzi:
Możesz użyć Z wyjątkiem :
Prawdopodobnie nie potrzebujesz nawet tych zmiennych tymczasowych:
Pamiętaj, że
Except
nie modyfikuje żadnej z list - tworzy nową listę z wynikiem.źródło
IEnumerable<car>
, a nieList<car>
. Musisz zadzwonić,ToList()
aby odzyskać listę. Ponadto uważam, że tak powinno byćGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
jeśli wcześniej go nie miałeś.Except
ponieważ faktycznie wykonuje ona operację ustawiania , która odróżnia wynikową listę. Nie spodziewałem się takiego zachowania, ponieważ używam, aList
nieHashSet
. Związane z.Nie potrzebujesz indeksu, ponieważ
List<T>
klasa umożliwia usuwanie elementów według wartości zamiast indeksowania za pomocąRemove
funkcji.źródło
list2.Remove(item);
instrukcji.list1.ForEach(c => list2.Remove(c));
Polecam korzystanie z metod rozszerzenia LINQ . Możesz to łatwo zrobić za pomocą jednego wiersza kodu:
Zakłada się oczywiście, że obiekty z listy 1, które usuwasz z listy 2, są tą samą instancją.
źródło
W moim przypadku miałem dwie różne listy, ze wspólnym identyfikatorem, trochę jak klucz obcy. Drugie rozwiązanie cytowane przez „nzrytmn” :
Był tym, który najlepiej pasował do mojej sytuacji. Musiałem załadować DropDownList bez rekordów, które zostały już zarejestrowane.
Dziękuję Ci !!!
To jest mój kod:
źródło
Możesz użyć LINQ, ale wybrałbym
RemoveAll
metodę. Myślę, że to ten, który lepiej wyraża twoją intencję.źródło
źródło
O(N)
, doprowadzi to doO(N^2)
problemu z dużymi listami.Rozwiązanie 1: Możesz to zrobić w następujący sposób:
Ale w niektórych przypadkach to rozwiązanie może nie działać. jeśli to nie działa, możesz użyć mojego drugiego rozwiązania.
Rozwiązanie 2:
udajemy, że lista1 jest twoją główną listą, a lista2 to twoja lista pomocnicza i chcesz dostać pozycje z listy 1 bez pozycji z listy2.
źródło
Ponieważ
Except
nie modyfikuje listy, możesz użyć ForEach naList<T>
:Może nie jest to najbardziej efektywny sposób, ale jest prosty, dlatego czytelny i aktualizuje oryginalną listę (co jest moim wymaganiem).
źródło
Proszę bardzo ..
źródło