2014-11-28 13 views
7

Mam listę zawierającą niektóre obiekty i chcę użyć LINQ do usunięcia określonego elementu, ale nie jestem pewien, jak to zrobić.Usunięcie określonego elementu z listy przy użyciu LINQ

foreach (var someobject in objectList) 
{ 
    if (someobject.Number == 1) // There will only one item where Number == 1. 
    { 
     list.remove(someobject) 
    } 
} 
+2

Twój kod nie działa, a co? –

+0

W przeciwieństwie do tego, co żądasz, twój obecny kod w ogóle nie zawiera LINQ. Czy masz konkretne powody, dla których potrzebujesz/potrzebujesz rozwiązania opartego na LINQ? Czy też inne skuteczne rozwiązanie byłoby do przyjęcia? – stakx

+1

@VsevolodGoloviznin: Powyższy kod nie może działać, ponieważ zawiera błędy składni - 'list.remove (someobject)'. – stakx

Odpowiedz

27

You cannot use a foreach to remove items podczas wyliczenia, otrzymujesz wyjątek w czasie wykonywania.

Można użyć List.RemoveAll:

list.RemoveAll(x => x.Number == 1); 

lub, jeśli to faktycznie nie List<T> ale każda sekwencja, LINQ:

list = list.Where(x => x.Number != 1).ToList(); 

Jeżeli jesteś pewien, że istnieje tylko jeden element z tej liczby lub chcesz usunąć jedną pozycję na maksimum, możesz użyć metody pętli for sugerowanej w innej odpowiedzi lub następującej:

var item = list.FirstOrDefault(x => x.Number == 1); 
if(item ! = null) list.Remove(item); 

Link do innego opublikowanego przeze mnie pytania sugeruje, że można modyfikować kolekcję podczas wyliczenia w C# 4 i późniejszych. Nie, nie możesz. That applies only to the new concurrent collections.

+2

W tym przypadku można faktycznie użyć foreach, ponieważ jest tylko jeden element do usunięcia. Upewnij się, że używasz break, aby wyjść z pętli po usunięciu elementu, w przeciwnym razie otrzymasz wyjątek w następnej iteracji. Powiedział, że myślę, że rozwiązanie z RemoveAll() jest bardziej eleganckie. – haagel

2

Nie można użyć foreach, aby usunąć przedmiot z kolekcji. Spowoduje to zgłoszenie wyjątku, że kolekcja jest modyfikowana.

Można wykonać ją za

for (int i=objectList.Count-1; i>=0 ; i--) 
{ 
    if (objectList[i].Number == 1) // there will only one item with Number = 1 
    { 
     objectList.Remove(objectList[i]); 
    } 
} 

innym przypadku jest użycie Remove/RemoveAll jak Tim Schmelter show.

+0

Jak wskazano w innym miejscu, jeśli jesteś zadowolony z 'break' po znalezieniu dopasowania, nie ma powodu, aby przełączać pętlę' foreach' na pętlę 'for'. – Rawling

+1

@Rawienie innego faceta dodało instrukcję break. W każdym razie odpowiedź na początku też nie była dobra. – mybirthname

-1

można usunąć w indeksie, jeśli wartość spełnia kryteria

for (int i=0; i < objectList.Count; i ++) 
{ 
    if (objectList[i].Number == 1) // there will only one item with Number = 1 
    { 
     objectList.RemoveAt[i]; 
    } 
} 
1

można użyć pętli foreach, aby usunąć element z listy. Ważną rzeczą jest użycie break, aby zatrzymać pętlę po usunięciu elementu. Jeśli pętla będzie kontynuowana po usunięciu elementu z listy, zostanie zgłoszony wyjątek.

foreach (var someobject in objectList) 
{ 
    if (someobject.Number == 1) // There will only one item where Number == 1 
    { 
     objectList.remove(someobject); 
     break; 
    } 
} 

Jednak będzie to działać TYLKO jeśli jest tylko jeden obiekt, który chcesz usunąć, tak jak w twoim przypadku.

Powiązane problemy