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

时间:2014-07-08 12:51:20

标签: c# .net

我想计算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++;

最后一种方法也可以是exandend来计算几个条件而不必多次迭代循环。 (我已经找到了getting the count property only takes 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)

我的问题:
有没有这样的事情,我还没找到呢? 如果不是:实现此类功能的方法是什么?

编辑:
添加LINQ看起来就像修复了它。

2 个答案:

答案 0 :(得分:8)

你的语法略有偏差。这是使用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));

答案 1 :(得分:3)

使用谓词的计数方法:请参阅Enumerable.Count Method (IEnumerable, Func)

请注意,此方法是extension method,只有在添加对System.Linq命名空间的引用时才能使用它。