Powiedz, że mam zapytanie LINQ, takie jak:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Biorąc pod uwagę, że authorsList
jest to typ List<Author>
, jak mogę usunąć Author
elementy, authorsList
które są zwracane przez zapytanie do authors
?
Lub, inaczej mówiąc, jak mogę usunąć z Boba wszystkich imion równych imionom authorsList
?
Uwaga: jest to uproszczony przykład do celów pytania.
Contains
kontrola jest szybka i zapewnia, że oceniasz sekwencję tylko raz.List<T>
go użyć.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Lepiej byłoby użyć Listy <T> .Usuń wszystko, aby to osiągnąć.
źródło
Jeśli naprawdę musisz usunąć elementy, to co z wyjątkiem ()?
Możesz usunąć na podstawie nowej listy lub usunąć w locie, zagnieżdżając Linq.
źródło
Except()
jest jedynym sposobem na przejście w środku instrukcji LINQ.IEnumerable
nie maRemove()
aniRemoveAll()
.Nie można tego zrobić ze standardowymi operatorami LINQ, ponieważ LINQ zapewnia zapytania, a nie obsługę aktualizacji.
Ale możesz wygenerować nową listę i zastąpić starą.
Lub możesz usunąć wszystkie elementy w
authors
drugim przebiegu.źródło
RemoveAll()
nie jest operatorem LINQ.Remove
jest również metodąList
<T
>, a nie metodą System.Linq.Enumerable .Proste rozwiązanie:
źródło
Zastanawiałem się, czy jest jakaś różnica między
RemoveAll
iExcept
za używaniemHashSet
, więc zrobiłem szybką kontrolę wydajności :)Wyniki poniżej:
Jak widzimy, najlepszą opcją w tym przypadku jest użycie
RemoveAll(HashSet)
źródło
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
kompiluje dobrze tylko FYITo bardzo stare pytanie, ale znalazłem naprawdę prosty sposób:
Zauważ, że ponieważ zmienną zwracaną
authorsList
jest aList<T>
,IEnumerable<T>
zwrócone przezExcept()
musi zostać przekonwertowane na aList<T>
.źródło
Możesz usunąć na dwa sposoby
lub
Miałem ten sam problem, jeśli chcesz proste wyjście w oparciu o twój warunek gdzie, to pierwsze rozwiązanie jest lepsze.
źródło
Powiedzieć, że
authorsToRemove
jest toIEnumerable<T>
, że zawiera elementy, które chcesz usunąć zauthorsList
.Oto kolejny bardzo prosty sposób wykonania zadania usuwania zadanego przez OP:
źródło
Myślę, że możesz zrobić coś takiego
Chociaż myślę, że podane już rozwiązania rozwiązują problem w bardziej czytelny sposób.
źródło
Poniżej znajduje się przykład usunięcia elementu z listy.
źródło
LINQ ma swoje początki w programowaniu funkcjonalnym, które podkreśla niezmienność obiektów, więc nie zapewnia wbudowanego sposobu aktualizacji oryginalnej listy w miejscu.
Uwaga na temat niezmienności (zaczerpnięta z innej odpowiedzi SO):
Oto definicja niezmienności z Wikipedii .
źródło
myślę, że musisz przypisać elementy z listy autorów do nowej listy, aby uzyskać ten efekt.
źródło
Aby zachować płynność kodu (jeśli optymalizacja kodu nie jest kluczowa) i musisz wykonać kilka dalszych operacji na liście:
lub
źródło