有条件地从列表中删除N个项目
时间:2020-03-05 18:40:47 来源:igfitidea点击:
当我需要从列表中删除项目(仅当它们符合特定条件时)时,我正在编写一些ASP.NET控件。
通用List
类的RemoveAll
方法做得很好,但是删除了所有与谓词指定的条件相匹配的项。
如果我只想删除指定条件的某些项目该怎么办?我们认为什么是最好的方法?
解决方案
回答
除非该方法提供了" limit"参数(否则),否则最好的选择是使用一个简单的循环来删除匹配的项,当递增的" match counter"达到极限时,该循环将中断。
无论如何,这几乎就是内部函数的工作方式,但是以更优化的方式。
回答
在框架3.5中,RemoveAll方法将谓词作为参数。所以你可以用
list.RemoveAll(item => ShouldIRemoveThis(item));
其中ShouldIRemove这是一个返回布尔值的方法,该布尔值指示是否必须从列表中删除该项目。
回答
可以使用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与方法具有相同的签名,因此它们是等效的,因此我们可以直接传递方法。
回答
如果要同时指定要删除的项目数的限制和选择要删除的项目的条件,则可以使用以下方法:
int limit = 30; // Suppose you want to remove 30 items at most list.RemoveAll(item => ShouldIRemoveThis(item) && limit-- > 0);