2

整数の単純なリスト(一部の値が繰り返されます)があり、次のように処理します。

var groups = from n in numbers
    group n by n into numGroup
    where numGroup.Count()>1
    select numGroup;

linq の直後にネストされたループを使用してグループを反復処理できますが、それらをループする別のメソッドを作成するのに問題があります。これが私が試したことです。

private void PrintGroups(IEnumerable groups, string title)
{
    int i = 0;
    foreach (var group in groups)
    {
        txt1.Text += "Group " + ++i + "\r\n"; ;
        foreach (var x in group)
               txt1.Text += "    " + x.ToString() + "\r\n"; ;
     }
}

コンパイラは内側の foreach を好みません。

「'オブジェクト' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントはタイプ 'オブジェクト' の変数を操作できません」

しかし、同じコードが linq とインラインで動作します。助言がありますか?

4

2 に答える 2

5

パラメータのタイプを変更するだけでいいようです:

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups, string title)

しかし、本当に気になるのはキーとカウントだけではありませんか? 結局のところ、グループ内のすべての値は同じになります...

private void PrintGroups(IEnumerable<IGrouping<int, int>> groups)
{
    StringBuilder builder = new StringBuilder();
    foreach (var group in groups)
    {
        builder.AppendFormat("Group {0}: {1}\r\n", group.Key, group.Count());
    }
    txt1.Text = builder.ToString();
}
于 2012-04-11T14:14:40.727 に答える
0

Linq では射影を考えます。これは、数値のグループをユーザーに表示できる文字列に射影する例です。

 var nums = new List<int>() { 1, 1, 5, 6, 1, 5, 2 };

 nums.GroupBy (n => n)
     .Select (n => string.Format("Number {0} is found {1} times ({2})", n.Key, n.Count (), string.Join(",", n)))
     .ToList()
     .ForEach(strN => Console.WriteLine (strN));

/* Output

Number 1 is found 3 times (1,1,1)
Number 5 is found 2 times (5,5)
Number 6 is found 1 times (6)
Number 2 is found 1 times (2)

*/
于 2012-04-11T14:19:28.717 に答える