【问题标题】:Count elements that match a condition with LINQ使用 LINQ 计算与条件匹配的元素
【发布时间】:2017-11-12 20:34:10
【问题描述】:

我尝试使用来自How to count the number of elements that match a condition with LINQ 的代码 它有效,但我的结果总是等于列表中元素的数量。我的清单上有 10 个日期,结果是 10 个。我需要计算具有特定日期的元素。

var zz = both.ToList(); // dates list
int con = list1.Where(p => list1.Contains(zz[0])).Count();
Console.WriteLine("count: " + con);

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您在代码中使用了两次list,既作为Where 子句的来源,又作为Contains 方法的来源,因此会产生意想不到的结果。而应该是:

    int con = list1.Where(p => zz.Contains(p)).Count();
    

    代替:

    int con = list1.Where(p => list1.Contains(zz[0])).Count();
    

    【讨论】:

    • 这段代码可以正常工作。多谢!但是你为什么不使用 zz[0] 呢?我如何理解哪个日期用于比较?如果放入索引,我会收到错误:严重代码描述项目文件行抑制状态错误 CS1929 'DateTime' 不包含'包含'的定义和最佳扩展方法重载
    • @DiegoSlinger 当您使用zz[0] 时,您总是检查list1 包含列表zz 的第一个元素,这也可能是您想要的,但根据您的描述,这是非常不太可能。但是当您执行Where(p => zz.Contains(p)) 时,您正在检查源集合list1 的每个元素是否包含在列表zz 中,然后在调用Count 时保留该元素以进行缩减。但是,如果您想指定日期而不是使用包含,您可以使用list1.Where(p => p >= startDate && p <= endDate).Count();。其中startDateendDate 是界限。
    • 是的,现在我明白了。有没有其他方法可以执行相同的检查,但只针对 zz 列表中的第一个元素?
    • @DiegoSlinger 只需执行 int con = list1.Where(p => p == zz[0]).Count(); 或者如果您想忽略时间部分,请执行 int con = list1.Where(p => p.Date == zz[0].Date).Count();
    • 我要补充一点,你可以只使用Count 而不是Where(...).Count(),它需要一个谓词。
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多