使用LINQ在列表中计算给定对象的数量

7

我有一个列表,里面可能包含多个相同的对象。现在我需要计算这个给定对象在列表中出现的次数。

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

我相信使用LINQ可以更好地完成这项任务,但对我来说,LINQ仍然是一个谜。

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

提前感谢,
弗兰克

4个回答

15
你可以使用Count扩展方法轻松计算集合中的对象数量。可以选择以下任一方式:
var count = myList.Where(item => item == object2Count).Count();

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

在性能方面,它应该与foreach循环相同。

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


谢谢你的回答。现在我看到答案,感觉这样很明显 :D。至于我的谓词,有什么奇怪的地方,你会建议用其他方式来写吗? - Aaginor
@Aaginor:如果“==”使用引用相等性,并且您在集合中没有存储相同的实例,则“count”将为0或1。因此,基本上您正在确定“object2Count”是否属于集合。有更有效的方法可以使用“Any”扩展方法来确定。另一方面,如果您已覆盖“==”运算符,则谓词是正确的。 - Martin Liversage
我不创建重复的对象来存储,而是多次存储同一个引用。(例如:IMyObject o = new MyObject(); myList.Add(o); myList.Add(o);)(或者至少我相信我确实存储了同一个对象:D) - Aaginor
@Aaginor:如果你想要计算集合中特定引用被存储的次数,你的谓词是正确的。 - Martin Liversage

1
int count = myList.Count(x => x == object2Count);

0

试试这个:

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

1
-1 - 这个查询并不返回 object2Count 的实例数量,而是类 ObjectClass 对象的数量。 - Jakub Konecki
这是错误的,他不是在寻找某个类的所有对象,而是特定的一个对象。 - Vedran

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接