9

如果我太努力的话,我可能会扼杀术语,所以通过代码来描述会更容易:

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> ,因为块中的某些返回类型不能隐式转换为委托返回类型”

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

4

3 回答 3

10

您尝试对 group by 执行的操作没有多大意义。我提出以下建议。

如果您正在寻找有多少个元素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();
于 2013-02-13T23:29:49.327 回答
7

IEnumerable<IGrouping<int, Foo>>你通过分组获得。

它是一IEnumerable组。该组的键类型为int,这是因为您按 int id 列分组。该分组包含一个IEnumerable包含所有具有此键的对象的列表。它是类型Foo

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

var fooGrouping = fooList.GroupBy(x => x.SomeID);
var someCount = fooGrouping.Where(grp => grp.Key == someKey).Select(p=>p.Count());
于 2013-02-13T23:20:29.750 回答
1

尝试这个:

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

或者更干净

var someCount = fooGroup.Sum(y => y.Count(f => f.Bar == "Bar"));
于 2013-02-13T23:25:37.670 回答