2012-05-10 38 views
7

我有一個元素列表,但是如果列表元素的數量大於4我想刪除所有元素,但只保留列表中的前4個。C# - List - 刪除所有元素,但不是前四個

實施例:

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

新的列表應該是 - 1,2,3,4-

我期待在使用List.RemoveAll(),但不知道要放什麼東西在括號

期待一些幫助....

史蒂芬

回答

15

爲什麼不使用List.RemoveRange

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

(這是假設你變異現有列表。如果你很高興創建一個新的序列,我肯定會根據Adam的建議使用list.Take(4),無論是否需要撥打ToList。這些天,我傾向於建立查詢,而不是變異現有集合)

+0

的differnce的是,這裏原始列表改變... – Tigran

+0

+1直接回答問題,但我同意你的查詢意見。我發現這些日子裏越來越少的實例需要一個list/array/new集合。 –

+0

@jon所以澄清此方法將從列表中刪除元素,只留下前四個元素。如果是這樣,這是完美的,謝謝:) – swade1987

9

或者,您可以從舊創建項目一個新的列表:

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

這將創建一個名單,然而,是不是與從原始列表中刪除相同。

或者,如果你需要做的是迭代他們,根本沒有Take一個ToList裏面foreach

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

然後你得到延遲執行,而不是在創建列表花費內存。

正如一個側面說明,使用LINQ和LINQ擴展我找到代碼聲明你的意圖明確:list.Take(4)讀取一目瞭然比list.RemoveRange(4, list.Count - 4);容易得多。代碼意圖對維護和團隊工作非常重要。

0

使用LINQ的Take

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

這需要您的列表的前4項,並指定一個新的列表來代替您的舊列表。

不需要檢查長度,因爲在其他答案中,因爲「枚舉源代碼並生成元素,直到count元素已經生成或源代碼不再包含元素。」禮貌Adam Houldsworth

+0

好吧,它將它分配給一個新的*列表來替代舊的列表 - 它將被標記爲GC,假設這是它的唯一參考。除了迭代它的前4項外,它對相同的列表沒有任何作用。 –

+0

@AdamHouldsworth:謝謝,並予以糾正。 –

0

試試這個

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();