我在寫一些ASP.NET控件,當我需要從列表中刪除項目時,只有當它們符合某個條件時纔會執行此操作。從列表中有條件地刪除N個項目
通用List
類的RemoveAll
方法做了很好的工作,但刪除符合條件所有項目,由謂詞指定。
如果我只想刪除指定條件的某些項目,該怎麼辦?你認爲最好的辦法是做什麼?
我在寫一些ASP.NET控件,當我需要從列表中刪除項目時,只有當它們符合某個條件時纔會執行此操作。從列表中有條件地刪除N個項目
通用List
類的RemoveAll
方法做了很好的工作,但刪除符合條件所有項目,由謂詞指定。
如果我只想刪除指定條件的某些項目,該怎麼辦?你認爲最好的辦法是做什麼?
如果你想同時指定物品的數量限制刪除和選擇項目刪除一個條件,你可以使用這種方法:
int limit = 30; // Suppose you want to remove 30 items at most
list.RemoveAll(item => ShouldIRemoveThis(item) && limit-- > 0);
除非該方法提供一個「限制」參數(不)你最好的選擇是去用一個簡單的循環,消除相匹配的項目,打破當你增加「一致計數器」打你的極限。
這幾乎是內部函數如何工作,但在一個更優化的方式。
在框架3.5中,RemoveAll方法將謂詞作爲參數。所以,你可以使用
list.RemoveAll(item => ShouldIRemoveThis(item));
其中ShouldIRemoveThis是返回一個布爾值,指示是否該項目必須從列表中刪除的方法。
你可以使用LINQ嗎?如果是這樣,您可以使用.Take()方法並指定您想要的記錄數(可能總數爲N)。
匿名代表在這裏很有用。一個簡單的例子,從列表中刪除第一個限制偶數。
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表達式,以真正的測試作爲參數。
@buyutec
而不是
list.RemoveAll(item => ShouldIRemoveThis(item));
你可以使用:
list.RemoveAll(ShouldIRemoveThis);
拉姆達具有相同簽名的方法,所以他們是等價的,所以你可以只通過方法直接。
lambda表達式是如此KEWL。 – Cheeso 2009-02-24 06:04:25