【问题标题】:Count number of given object in a list with LINQ使用 LINQ 计算列表中给定对象的数量
【发布时间】:2011-06-20 09:08:57
【问题描述】:

我有一个列表,其中可以包含同一对象的多次出现。现在我需要计算给定对象包含在此列表中的频率。

int count = 0;
foreach (IMyObject item in myList)
  if (item == object2Count)
    count++;

我确信使用 LINQ 可以做得更好,但 LINQ 对我来说仍然是个谜。

我的第一个问题是:我如何通过 LINQ 计算对象,第二个问题是:这个 LINQ 版本会更慢还是更快?我正在使用 ObservableCollection 并且列表中的项目数量通常很少......通常不超过 20。

提前致谢,
弗兰克

【问题讨论】:

    标签: c# linq list


    【解决方案1】:

    您可以使用Count 扩展方法轻松计算集合中的对象。要么:

    var count = myList.Where(item => item == object2Count).Count();
    

    var count = myList.Count(item => item == object2Count);
    

    就性能而言,它应该与foreach 循环相同。

    (您的谓词item == object2Count 看起来有点奇怪,但这与关于如何计算集合中的对象的问题无关。)

    【讨论】:

    • 感谢您的回答。现在我看到了答案,这似乎很明显:D。至于我的谓词,它有什么奇怪的地方,您建议如何以其他方式编写它?
    • @Aaginor:如果== 使用引用相等,并且您不会在集合中多次存储同一实例,count 将是 0 或 1。所以基本上您正在确定 @ 987654329@ 属于集合。有更有效的方法来确定使用Any 扩展方法。另一方面,如果您已经覆盖了== 运算符,那么您的谓词就可以了。
    • 我不创建要存储的重复对象,而是多次存储相同的引用。 (就像 IMyObject o = new MyObject(); myList.Add(o); myList.Add(o);) (或者至少我相信我确实存储了相同的对象:D)
    • @Aaginor:如果您想计算特定引用在集合中存储的次数,您的谓词是正确的。
    【解决方案2】:
    int count = myList.Count(x => x == object2Count);
    

    【讨论】:

      【解决方案3】:

      Look at 101 LINQ Samples

      int count = myList.Count(item => item == object2Count);

      【讨论】:

        【解决方案4】:

        试试这个:

        var count = objectlist.Count(x => x == object2Count));
        

        【讨论】:

        • -1 - 此查询不返回 object2Count 的实例数,而是 ObjectClass 类的对象数
        • 这是错误的,他不是在寻找某个类的所有对象,而是在寻找特定的对象
        猜你喜欢
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        相关资源
        最近更新 更多