2008-08-19 89 views
2

我在寫一些ASP.NET控件,當我需要從列表中刪除項目時,只有當它們符合某個條件時纔會執行此操作。從列表中有條件地刪除N個項目

通用List類的RemoveAll方法做了很好的工作,但刪除符合條件所有項目,由謂詞指定。

如果我只想刪除指定條件的某些項目,該怎麼辦?你認爲最好的辦法是做什麼?

回答

8

如果你想同時指定物品的數量限制刪除和選擇項目刪除一個條件,你可以使用這種方法:

int limit = 30; // Suppose you want to remove 30 items at most 
list.RemoveAll(item => ShouldIRemoveThis(item) && limit-- > 0); 
+0

lambda表達式是如此KEWL。 – Cheeso 2009-02-24 06:04:25

1

除非該方法提供一個「限制」參數(不)你最好的選擇是去用一個簡單的循環,消除相匹配的項目,打破當你增加「一致計數器」打你的極限。

這幾乎是內部函數如何工作,但在一個更優化的方式。

1

在框架3.5中,RemoveAll方法將謂詞作爲參數。所以,你可以使用

list.RemoveAll(item => ShouldIRemoveThis(item)); 

其中ShouldIRemoveThis是返回一個布爾值,指示是否該項目必須從列表中刪除的方法。

1

你可以使用LINQ嗎?如果是這樣,您可以使用.Take()方法並指定您想要的記錄數(可能總數爲N)。

0

匿名代表在這裏很有用。一個簡單的例子,從列表中刪除第一個限制偶數。

List<int> myList = new List<int>; 
for (int i = 0; i < 20; i++) myList.add(i); 

int total = 0; 
int limit = 5; 
myList.RemoveAll(delegate(int i) { if (i % 2 == 0 && total < limit) { total++; return true; } return false; }); 

myList.ForEach(i => Console.Write(i + " ")); 

給出1 3 5 7 9 10 11 12 13 14 15 16 17 18 19,如我們所希望的那樣。容易夠到包裹,最多在一個功能,適合用作lambda表達式,以真正的測試作爲參數。

5

@buyutec

而不是

list.RemoveAll(item => ShouldIRemoveThis(item)); 

你可以使用:

list.RemoveAll(ShouldIRemoveThis); 

拉姆達具有相同簽名的方法,所以他們是等價的,所以你可以只通過方法直接。