有条件地从列表中删除N个项目

时间:2008-08-19 15:57:51

标签: .net

当我进入我需要从列表中删除项目的场景时,我正在编写一些 ASP.NET 控件,只有当它们匹配某个条件时才会生成。

通用RemoveAll类的List方法做得很好,但删除了与谓词指定的条件匹配的所有项。

如果我只想删除指定条件的特定数量的项目怎么办?您认为最好的方法是什么?

6 个答案:

答案 0 :(得分:8)

如果要同时指定要删除的项目数限制以及选择要删除的项目的条件,可以使用以下方法:

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

答案 1 :(得分:5)

@buyutec

而不是

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

你可以使用:

list.RemoveAll(ShouldIRemoveThis);

lambda与方法具有相同的签名,因此它们是等效的,因此您可以直接传递该方法。

答案 2 :(得分:1)

除非方法提供了“限制”参数(它没有提供),否则最好的选择是使用一个简单的循环来删除匹配的项目,当你增加的“匹配计数器”达到你的限制时就会中断。

这几乎是内部函数如何工作,但是以更优化的方式。

答案 3 :(得分:1)

在框架3.5中,RemoveAll方法将谓词作为参数。所以你可以使用

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

其中ShouldIRemoveThis是一个返回布尔值的方法,指示是否必须从列表中删除该项。

答案 4 :(得分:0)

你能使用LINQ吗?如果是这样,你可以使用.Take()方法并指定你想要的记录数(可能是总数 - N)。

答案 5 :(得分: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表达式,将实际测试作为参数。