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"));

上記は、このエラーのためにコンパイルされません:「System.Func<System.Linq.IGrouping<int,Foo>,bool> ブロック内の一部のリターンタイプがデリゲートリターンタイプに暗黙的に変換できないため、ラムダ式をデリゲートタイプに変換できません」

答えはとても簡単だと思いますが、これを行う方法に頭を悩ませることはできません。

4

3 に答える 3

10

あなたがgroupbyでやろうとしていることは、あまり意味がありません。私は以下を提案します。

要素の数を探している場合は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、intid列でグループ化したためです。グループ化には、IEnumerableすべてこのキーを持つオブジェクトのリストを含むが含まれます。タイプFooです。

次に、それは単純なクエリです。グループ化から、必要なキー(つまり、int id)を持つものを見つけ、グループからカウントを選択します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 に答える