计算符合List集合中某些条件的对象

Mar*_*ark 0 .net c#

我想计算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看起来像它修复它.

D S*_*ley 8

你只需稍微关闭语法.这是如何使用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)