使用LINQ,获取满足分组标准的项目数

时间:2013-02-13 23:16:29

标签: c# .net linq

如果我努力尝试,我可能会对术语进行屠宰,因此通过代码描述会更容易:

var fooGroup = fooList.GroupBy(x => x.SomeID);
//fooGroup is now of type IEnumerable<IGrouping<int, Foo>>
var someCount = fooGroup.Count(y => y.Where(f => f.Bar == "Bar"));

由于此错误,上述内容无法编译:“无法将lambda表达式转换为委托类型System.Func<System.Linq.IGrouping<int,Foo>,bool> 因为块中的某些返回类型不能隐式转换为委托返回类型“

我认为答案很简单,但我无法完全理解如何做到这一点。

3 个答案:

答案 0 :(得分:9)

你想要对一个小组做什么并不是很有意义。我提出以下建议。

如果您正在查找有Bar == "Bar"个元素的数量,请在该组之前执行此操作。

var someCount = fooList.Count(y => f.Bar == "Bar");

如果您想要计算包含符合相同条件的元素的组。

var fooGroup = fooList.GroupBy(x => x.SomeID)
    .Where(x => x.Any(z => z.Bar == "Bar")).Count();

答案 1 :(得分:6)

您通过分组得到的IEnumerable<IGrouping<int, Foo>>

这是IEnumerable个群组。该组的密钥类型为int,这是因为您按int id列进行了分组。分组包含IEnumerable,其中包含所有具有此密钥的对象列表。它的类型为Foo

然后这是一个简单的查询。从分组中,您可以找到具有所需密钥的那些(即int id),然后从组IEnumerable中选择计数。

var fooGrouping = fooList.GroupBy(x => x.SomeID);
var someCount = fooGrouping.Where(grp => grp.Key == someKey).Select(p=>p.Count());

答案 2 :(得分:0)

试试这个:

var someCount = fooGroup.Sum(y => y.Where(f => f.Bar == "Bar").Count());

或者更干净

var someCount = fooGroup.Sum(y => y.Count(f => f.Bar == "Bar"));