Mam dwie kolekcje obiektów (lista list1 i lista list2). Na każdym z nich nazywa się "ID". Wiem, że lista2 zawsze będzie zawierała więcej elementów niż lista1, po prostu potrzebuję łatwego sposobu na pobranie kolekcji wszystkich elementów, które istnieją na liście2, ale nie na liście1 za pomocą wyrażeń lambda LINQ.LINQ Lambda - Znajdź wszystkie identyfikatory na liście, których nie ma na innej liście.
16
A
Odpowiedz
34
Jeśli Potrzebują tylko identyfikatory przedmiotów, a następnie Mark's answer ładnie załatwią sprawę. Jeśli trzeba powrócić samych przedmiotów (i nie mają już odpowiednią realizację Equals
) to można spróbować czegoś takiego:
// assumes that the ID property is an int - change the generic type if it's not
var ids = new HashSet<int>(list1.Select(x => x.ID));
var results = list2.Where(x => !ids.Contains(x.ID));
22
To będzie Ci identyfikatory, które są tylko w listy2:
var ids = list2.Select(x => x.Id).Except(list1.Select(x => x.Id));
Jeśli obiekty porównać równe, gdy mają ten sam identyfikator następnie można uprościć do:
var objects = list2.Except(list1);
Powiązane problemy
- 1. Zapytanie MongoDB o dokumenty, których identyfikatory znajdują się na liście
- 2. Jak znaleźć numery, których nie ma na liście?
- 3. Uzyskaj identyfikatory wszystkich obiektów na liście
- 4. Znajdź obiekty potomne na liście obiektów nadrzędnych za pomocą LINQ
- 5. Znajdź wszystkie indeksy pozycji na liście przy użyciu strumienia API
- 6. znajdź indeks int na liście
- 7. Usuń pozycje z listy 1 nie ma na liście 2
- 8. Jak sprawdzić, czy wszystkie pozycje na liście znajdują się na innej liście?
- 9. Kwadratura wszystkie elementy na liście
- 10. Znajdź pierwszy element określonego typu na liście, używając LINQ
- 11. Znajdź drugi maksimum na liście wartości, używając linq C#
- 12. Pozycjonowanie pozycji na liście za pomocą LINQ
- 13. Znajdź indeksy elementu na liście zagnieżdżonej?
- 14. LINQ Dołącz, aby znaleźć elementy NIE znajdujące się na liście
- 15. Znajdź indeks pierwszego elementu na liście.
- 16. Znajdź elementy nie na mniejszej liście znaków, ale na dużej liście
- 17. Znajdź najbliższą wartość na liście zamówień
- 18. Powłoka: znajdź pliki na liście w katalogu
- 19. Znajdź najstarszy/najmłodszy obiekt datetime na liście
- 20. Java 8 uzyskać wszystkie elementy na liście
- 21. Fragment ramki danych Pandy segmentów według etykiet, których nie ma na liście.
- 22. Queryover gdzie id nie jest na liście
- 23. Jak przyciąć wszystkie elementy na liście?
- 24. odjąć wszystkie pozycje na liście przed siebie
- 25. Flag wszystkie ale jeden duplikaty na liście
- 26. Wybierz wiersze spełniające wszystkie pozycje na liście
- 27. Usuń wszystkie oprócz pierwszego elementu na liście
- 28. Znajdź element w liście krotek
- 29. zookeeper: My id 4 nie ma na liście rówieśniczej
- 30. Common Lisp: wszystkie elementy są prawdziwe na liście
Dlaczego umieścić w HashSet? (Możliwe: var ids = list1.Select (x => x.ID);) –
@ David_001: Można to zrobić, ale wtedy wyszukiwanie "Zawiera" byłoby O (n), a nie O (1), wykonanie zapytania jako całości O (n * m) zamiast O (n + m). Prawdą jest, że prawdopodobnie nie byłoby to zauważalne w przypadku mniejszych kolekcji, ale gdyby było wiele elementów, wydajność naprawdę ucierpiałaby bez wyszukiwania O (1) zapewnionego przez 'HashSet'. –
LukeH
Tak, nie brałem pod uwagę wydajności. HashSet będzie znacznie szybszy w prawie wszystkich sytuacjach, ale szczególnie w przypadku dużych rozmiarów list2. Z tego powodu jest to najlepsze rozwiązanie tego problemu, ale myślę, że mogłeś przeoczyć koszt konstruktora dla HashSet w swoich wielkich sumach O. W szczególności, jeśli lista2 będzie bardzo mała (powiedzmy 10 pozycji), Contains nie jest jedynym wąskim gardłem, tworzenie listy ids jest, a poniższe będą szybsze (bez względu na rozmiar listy1): "var ids = lista1.Wybierz (x => x.ID) .ToList(); " –