在LINQ中应用Group By

时间:2009-10-15 15:48:50

标签: linq

我决定按照字符串的长度对集合进行分组。需要你的建议来纠正自己。

        string[] collection = {"five","four","ten","one"};

        var groupedValues =
                    from w in collection
                    group w by w.Length into getByGroup
                    select getByGroup;

        foreach (var g in groupedValues)
        {
            Console.WriteLine(g);
        }

输出结果为:

... System.Linq.Lookup

... System.Linq.Lookup

出了什么问题?

2 个答案:

答案 0 :(得分:2)

GroupBy返回一个Lookup对象,其中包含Key和分组中的集合。

foreach (var g in GroupedValues)
{
    Console.WriteLine("There are {1} strings of length {0}.", g.Key, g.Count());
    foreach (var v in g)
    {
        Console.WriteLine(" - {0}", v);
    }
}

答案 1 :(得分:1)

出了什么问题取决于你想做什么!

分组后返回的序列不是原始对象的平坦序列(因此在您的情况下,它不是字符串序列)。否则它们将如何分组?

也许鉴于你显然希望得到一个扁平的字符串列表,你实际上想要按长度排序:

var collection = new[] {"five","four","ten","one"};

var byLength = collection.OrderBy(s => s.Length);

foreach (var s in GroupedValues)
    Console.WriteLine(s);

或者如果你想对它们进行分组,那么你必须依次处理每个组,每个组都是一个单独的字符串列表:

foreach (var g in GroupedValues)
{
    Console.WriteLine("Strings of length " + g.Key + ":");

    foreach (var s in g) 
        Console.WriteLine("    " + s);
}