我想计算List<T>符合特定条件的对象的出现次数.
例如,像
int List<T>.Count(Predicate<T> match)
这样,例如,如果有一个列表chores,我可以看到有多少是逾期.
int overdue = listOfChores.Count((element) => { return element.DueDate <= DateTime.Today; });
Run Code Online (Sandbox Code Playgroud)
我知道这不存在,到目前为止,我通过以下方式解决这样的问题:
int overdue = listOfChores.FindAll([...]).Count;
Run Code Online (Sandbox Code Playgroud)
但是,分配和初始化新的List等只是为了得到计数.
以较少的分配开销等方式实现此目的:
int good = 0;
foreach(chore element in listOfChores)
if(element.DueDate <= DateTime.Today)
good++;
Run Code Online (Sandbox Code Playgroud)
最后一种方法也可以是exandend来计算几个条件而不必多次遍历循环.(我已经发现获取 count属性只需要O(1),但是要使List计数仍然需要花费很多时间)
int a = 0;
int b = 0;
foreach(chore element in listOfChores)
if(element.CondA)
a++;
if(element.CondB)
b++;
Run Code Online (Sandbox Code Playgroud)
鉴于此,我甚至可以想象出类似的东西
int[] List<T>.Count(Predicate<T>[] matches)
我的问题:
有没有这样的事情,我还没有找到它?
如果不是:实现此类功能的方法是什么?
编辑:
添加LINQ看起来像它修复它.
你只需稍微关闭语法.这是如何使用Count:
int overdue = listOfChores.Count(element => element.DueDate <= DateTime.Today);
Run Code Online (Sandbox Code Playgroud)
如果您已经拥有Predicate<T>并希望将其传递给它,Count就像调用函数一样:
Predicate<Chore> p = (element) => element.DueDate <= DateTime.Today;
int overdue = listOfChores.Count(element => p(element));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4370 次 |
| 最近记录: |