var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Jeśli nie masz pewności, czy element naprawdę istnieje, możesz użyć funkcji SingleOrDefault . SingleOrDefaultzwróci, nulljeśli nie ma przedmiotu ( Singlezgłasza wyjątek, gdy nie może znaleźć przedmiotu). Oba będą rzucać, gdy będzie zduplikowana wartość (dwa przedmioty o tej samej wartości id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
cóż, niż możevar itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
Vlad
1
Nie powinno tak być resultlist.Items.RemoveAt(1);?
DreamTeK,
49
Krótka odpowiedź: Usuń (z listy results)
results.RemoveAll(r => r.ID == 2);usunie przedmiot z ID 2 w results(na miejscu).
Filtruj (bez usuwania z oryginalnej listy results):
var filtered = result.Where(f => f.ID != 2);zwraca wszystkie elementy oprócz tego z ID 2
Szczegółowa odpowiedź:
Myślę, że .RemoveAll()jest bardzo elastyczny, ponieważ możesz mieć listę identyfikatorów produktów, które chcesz usunąć - zapoznaj się z poniższym przykładem.
Jeśli masz:
class myClass {publicint ID;publicstringFirstName;publicstringLastName;}
i przypisał niektóre wartości do results następujących:
var results=newList<myClass>{new myClass(){ ID=1,FirstName="Bill",LastName="Smith"},new myClass(){ ID=2,FirstName="John",LastName="Wilson"},new myClass(){ ID=3,FirstName="Doug",LastName="Berg"},new myClass(){ ID=4,FirstName="Bill",LastName="Wilson"},};
Następnie możesz zdefiniować listę identyfikatorów do usunięcia:
Będzie usunąć pozycje 2 i 3 oraz utrzymanie pozycji 1 i 4 - w sposób określony przezremoveList . Pamiętaj, że dzieje się to na miejscu, więc nie jest wymagane dodatkowe przypisanie.
Oczywiście możesz go również używać do pojedynczych elementów, takich jak:
results.RemoveAll(r => r.ID==4);
gdzie usunie to rachunek z identyfikatorem 4 w naszym przykładzie.
Innym podobnym podejściem (korzystającym z predykatu) jest użycie List.FindIndex/ List.RemoteAt(które ma cechę „miłą” lub „niezbyt przyjemną” polegającą na mutacji).
To prawda, ale być ostrożnym mówiąc, że operacja lista jest to mutacja. Lista korzysta z tablicy za kulisami i może odtworzyć tablicę o mniejszej lub większej pojemności, jeśli uzna to za konieczne. Zwykle usunięcie jest mutacją w miejscu istniejącej tablicy.
KeithS
To nie jest wątek bezpieczny, a ze względu na swoją prostotę możesz po prostu użyć SingleOrDefault, nie musi być zawarty w metodzie statycznej
Nikt nie powiedział, że jest bezpieczny dla wątków (i czy zależy to od tego, co powinny robić wątki; w rzeczywistości lepiej byłoby nadać innej konstrukcji w pamięci wątek roboczy niż pozwolić im wszystkim pracować na jednej równoległej kolekcji ), a OP chce wszystkich rekordów oprócz tego, który pasuje do predykatu, więc SingleOrDefault zwróci dokładnie to, czego nie chce. „Metoda statyczna” jest w rzeczywistości metodą rozszerzenia, podobnie jak większość Linq, i działa, ilekroć nie chcesz (jednego lub wielu elementów) łatwiej zdefiniować niż to, co robisz.
KeithS
5
Istnieje inne podejście. Wykorzystuje List.FindIndexi List.RemoveAt.
Chociaż prawdopodobnie użyłbym rozwiązania przedstawionego przez KeithS (tylko prosty Where/ ToList), to podejście różni się tym, że mutuje oryginalny obiekt listy. Może to być dobra (lub zła) „cecha” w zależności od oczekiwań.
W każdym razie FindIndex(w połączeniu z osłoną) zapewnia RemoveAtpoprawność, jeśli w identyfikatorach występują luki lub kolejność jest nieprawidłowa itp., A użycie RemoveAt(vs Remove) pozwala uniknąć drugiego przeszukiwania listy O (n) przez listę.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Krótka odpowiedź:
Usuń (z listy
results
)results.RemoveAll(r => r.ID == 2);
usunie przedmiot z ID 2 wresults
(na miejscu).Filtruj (bez usuwania z oryginalnej listy
results
):var filtered = result.Where(f => f.ID != 2);
zwraca wszystkie elementy oprócz tego z ID 2Szczegółowa odpowiedź:
Myślę, że
.RemoveAll()
jest bardzo elastyczny, ponieważ możesz mieć listę identyfikatorów produktów, które chcesz usunąć - zapoznaj się z poniższym przykładem.Jeśli masz:
i przypisał niektóre wartości do
results
następujących:Następnie możesz zdefiniować listę identyfikatorów do usunięcia:
I po prostu użyj tego, aby je usunąć:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Będzie usunąć pozycje 2 i 3 oraz utrzymanie pozycji 1 i 4 - w sposób określony przez
removeList
. Pamiętaj, że dzieje się to na miejscu, więc nie jest wymagane dodatkowe przypisanie.Oczywiście możesz go również używać do pojedynczych elementów, takich jak:
gdzie usunie to rachunek z identyfikatorem 4 w naszym przykładzie.
DotNetFiddle: Uruchom wersję demo
źródło
Jest mały pomocnik Linq, który mi się podoba, który jest łatwy do wdrożenia i może ułatwić czytanie zapytań w warunkach „gdzie nie”:
źródło
List.FindIndex
/List.RemoteAt
(które ma cechę „miłą” lub „niezbyt przyjemną” polegającą na mutacji).Istnieje inne podejście. Wykorzystuje
List.FindIndex
iList.RemoveAt
.Chociaż prawdopodobnie użyłbym rozwiązania przedstawionego przez KeithS (tylko prosty
Where
/ToList
), to podejście różni się tym, że mutuje oryginalny obiekt listy. Może to być dobra (lub zła) „cecha” w zależności od oczekiwań.W każdym razie
FindIndex
(w połączeniu z osłoną) zapewniaRemoveAt
poprawność, jeśli w identyfikatorach występują luki lub kolejność jest nieprawidłowa itp., A użycieRemoveAt
(vsRemove
) pozwala uniknąć drugiego przeszukiwania listy O (n) przez listę.Oto fragment kodu LINQPad :
Szczęśliwego kodowania.
źródło
Nie określasz, jaki rodzaj listy, ale ogólna lista może używać albo
RemoveAt(index)
metody, alboRemove(obj)
metody:źródło
Bardziej uproszczone:
nie ma potrzeby tworzenia nowego obiektu var.
źródło
... lub tylko
resultlist.RemoveAt(1)
jeśli znasz dokładnie indeks.źródło
źródło