对List-collection中满足一定条件的对象进行计数

本文关键字:对象 条件 List-collection 满足 | 更新日期: 2023-09-27 18:11:52

我想计算List<T>中符合特定条件的对象的出现次数。
例如:
int List<T>.Count(Predicate<T> match)
例如,如果我有一个chores的清单,我可以看到有多少是过期的。

int overdue = listOfChores.Count((element) => { return element.DueDate <= DateTime.Today; });  

我知道这是不存在的,到目前为止,我用下面的方法解决这样的问题:

int overdue = listOfChores.FindAll([...]).Count;

然而,分配和初始化一个新的List等只是为了获得计数。

一种使用更少的分配开销等的方法:

int good = 0;
foreach(chore element in listOfChores)
    if(element.DueDate <= DateTime.Today)
        good++;

最后一种方法还可以扩展为计算多个条件,而无需在循环中迭代多次。(我已经发现获得计数属性只需要O(1),但从列表中计数仍然需要花费大量时间)

int a = 0;
int b = 0;
foreach(chore element in listOfChores)
    if(element.CondA)
        a++;
    if(element.CondB)
        b++;

考虑到这一点,我甚至可以想象出像
这样的东西int[] List<T>.Count(Predicate<T>[] matches)

我的问题(s):
有没有这种东西,只是我还没找到而已?
如果没有:实现这些功能的方法是什么?

编辑:


添加LINQ似乎可以修复它。

对List-collection中满足一定条件的对象进行计数

你只是语法有点问题。这是如何使用Count:

int overdue = listOfChores.Count(element => element.DueDate <= DateTime.Today);

如果你已经有了一个Predicate<T>,并想把它传递给Count,只需像调用函数一样调用它:

Predicate<Chore> p = (element) => element.DueDate <= DateTime.Today; 
int overdue = listOfChores.Count(element => p(element));

有一个使用谓词的计数方法:参见Enumerable。Count Method (IEnumerable, Func)

注意这个方法是一个扩展方法,只有当你向System添加一个引用时才能使用它。Linq命名空间。