2012-05-10 14 views
7

Mam listę elementów, jednak jeśli liczba elementów listy jest większa niż 4, chcę usunąć wszystkie elementy, ale pozostawię pierwsze 4 tylko na liście.C# - Lista - usuń wszystkie elementy, ale NIE pierwszych czterech

przykład:

Lista <> - 1, 2, 3, 4, 5, 6, 7, 8

Nowa lista należy - 1,2,3,4

Czekam na użyciu List.RemoveAll(), ale nie wiem, co umieścić w nawiasie

Czekamy na jakąś pomoc ....

Steven

Odpowiedz

15

Dlaczego nie skorzystać List.RemoveRange:

if (list.Count > 4) 
{ 
    list.RemoveRange(4, list.Count - 4); 
} 

(to przy założeniu chcesz mutować istniejącej listy. Jeśli jesteś szczęśliwy tworząc nową sekwencję, zdecydowanie użyłbym list.Take(4) zgodnie z sugestią Adama, z lub bez wywołania ToList. Te dni mają tendencję do budowania zapytań zamiast mutacji istniejących zbiorów)

+0

differnce jest tu oryginalna lista jest zmieniana ... – Tigran

+0

+1 za udzielenie odpowiedzi bezpośrednio na pytanie, ale zgadzam się z opinią na temat zapytania. Uważam, że lista/tablica/nowa kolekcja jest wymagana w przeliczeniu na liczbę mniejszą liczbę wystąpień w tych dniach. –

+0

@jon, więc wyjaśnienie tej metody spowoduje usunięcie elementów z listy, pozostawiając tylko pierwsze cztery. Jeśli tak, to jest idealne, dzięki :) – swade1987

9

Alternatywnie, można utworzyć nową listę z elementów ze starego.

var firstFour = myList.Take(4).ToList(); 

ten tworzy listę nowy jednak tak to jest , a nie to samo, co usunięcie z pierwotnej listy.

Lub jeśli wszystko, co trzeba zrobić, to iterate im wystarczy Take bez ToList wewnątrz foreach:

foreach (var item in myList.Take(4)) 

wtedy dostać wykonanie odroczony i nie spędzają pamięci na tworzenie list.

Podobnie jak marginesie, z LINQ i LINQ rozszerzeń znajdę kod deklaruje swój zamiarbardziej wyraźnie: list.Take(4) czyta dużo łatwiejsze niż list.RemoveRange(4, list.Count - 4); na pierwszy rzut oka. Intencja w kodzie jest bardzo ważna dla utrzymania i pracy w zespołach.

0

Użyj Take LINQ.

myList = myList.Take(4).ToList() 

Zajmuje pierwsze 4 pozycje z listy i przypisuje nową listę w miejsce starej listy.

Nie trzeba sprawdzać długości, jak w innych odpowiedziach, ponieważ "Wykonuje wyliczenie źródła i dostarcza elementów do momentu uzyskania elementów zliczających lub źródła nie zawierają żadnych elementów." uprzejmości Adam Houldsworth

+0

Cóż, przypisuje go do * nowej * listy zamiast starej - która zostanie oznaczona jako GC, zakładając, że było to jedyne odniesienie do niej. Nie robi nic na tej samej liście, oprócz iteracji pierwszych 4 elementów tego. –

+0

@AdamHouldsworth: Dzięki i poprawione. –

0

Spróbuj

List<string> lstTest = new List<string>(); 
      lstTest.Add("test1"); 
      lstTest.Add("test2"); 
      lstTest.Add("test3"); 
      lstTest.Add("test4"); 
      lstTest.Add("test5"); 
      lstTest.Add("test6");   

      lstTest.RemoveRange(4, lstTest.Count - 4); 

      foreach (string item in lstTest) 
      { 
       Console.Write(item); 
      } 
      Console.ReadLine(); 
Powiązane problemy