【问题标题】:count objects that meet certain condition in List-collection统计 List-collection 中满足特定条件的对象
【发布时间】:2014-08-29 05:16:48
【问题描述】:

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

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

一种减少分配开销等的方法:

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

最后一种方法也可以扩展为计算多个条件,而无需多次迭代循环。 (我已经找到了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&lt;T&gt;.Count(Predicate&lt;T&gt;[] matches)

我的问题:
有没有这种东西,只是我还没找到?
如果没有:实现此类功能的方法是什么?

编辑:
添加 LINQ 似乎可以解决问题。

【问题讨论】:

标签: c# .net


【解决方案1】:

您的语法稍有偏差。这是Count的使用方法:

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

如果您已经有一个Predicate&lt;T&gt; 并想将它传递给Count,只需像函数一样调用它:

Predicate<Chore> p = (element) => element.DueDate <= DateTime.Today; 

int overdue = listOfChores.Count(element => p(element));

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多