如果我努力尝试,我可能会对术语进行屠宰,因此通过代码描述会更容易:
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>
因为块中的某些返回类型不能隐式转换为委托返回类型“
我认为答案很简单,但我无法完全理解如何做到这一点。
答案 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"));