如何访问GroupBy返回的内容

时间:2014-01-30 17:16:04

标签: c# linq

可笑的简单问题,对于我的生活,我无法弄清楚。如何“获取”GroupBy返回的值?

以下简单示例。我想打印出不止一次出现的第一个值。查看观察窗口中的输出(如下图所示),它表明list3 [0] [0]可能达到“1”。但它给了我一个错误。

注意,我正在寻找一般解决方案 - 即了解GroupBy返回的内容。

另外,我想使用监视窗口来帮助我弄清楚我将如何访问变量(因为我发现许多MSDN参考难以理解) - 这可能吗?

var list1 = new List<String>() {
            "one", "two", "three", "one", "two"};

var list3 = list1
            .GroupBy(x => x)
            .Where(x => x.Count() > 1)
            .ToList();

Console.WriteLine("list3[0][0]=" + list3[0][0]); //error

enter image description here

4 个答案:

答案 0 :(得分:1)

您正在寻找.Key属性,因为GroupBy会返回包含IGrouping elements的IEnumerable。

答案 1 :(得分:1)

GroupBy返回IEnumerable<IGrouping<TKey, TSource>>,其中每个IGrouping<TKey, TElement>对象包含一系列对象,而一个键不是 Multidimensional Array ,可以访问按索引 [][]

要访问第一个元素,请尝试此

static void Main(string[] args)
        {
            var list1 = new List<String>() {
            "one", "two", "three", "one", "two"};

            var list3 = list1
                        .GroupBy(x => x)
                        .Where(x => x.Count() > 1)
                        .ToList();
  Console.WriteLine("list3[0][0]=" + list3[0].ToList()[0].ToString()); 
//OR  Console.WriteLine("list3[0][0]=" + list3[0].First()); 
        }

答案 2 :(得分:1)

虽然VS调试器显示“索引”编号,因为基础类型是集合,但分组将公开为没有索引器的IGrouping<T>。如果只是想要第一个组中的第一个项目:

Console.WriteLine("list3[0][0] =" + list3.First().First()); 

如果您希望看到 all ,那么您可以通过分组循环:

int gi = 0, ii = 0;
foreach(var g in list3)
{
    foreach(item i in g)
    {
        Console.WriteLine("list3[{0}][{1}] = {2}", gi, ii, i); 
        ii++;
    }
    gi++;
}

答案 3 :(得分:1)

如果您查看documentation of GroupBy,您会看到它会返回IEnumerable<IGrouping<TKey, TSource>>

IGrouping<TKey,TSource>有一个属性Key,它本身会继承IEnumerable<TElement>

因此,您可以枚举从GroupBy调用返回的项目列表,并且每个元素将具有Key属性(这是您分组的任何内容)以及枚举每个项目(将是列表组合在一起的项目)


希望这表明更清楚一点。给出一个类:

public class Person
{
    public string Name{get;set;}
    public int Age{get;set;}
}

列表:

 var people = new List<Person>{
            new Person{Name="Jamie",Age=35},  
            new Person{Name="Bob",Age=45},
            new Person{Name="Fred",Age=35},  
        };

分组和枚举如下:

var groupedByAge = people.GroupBy(x => x.Age);
foreach(var item in groupedByAge)
{
    Console.WriteLine("Age:{0}", item.Key);
    foreach(var person in item)
    {
        Console.WriteLine("{0}",person.Name);
    }
 }

给出这个输出:

  

年龄:35个
        杰米
        弗雷德
  年龄:45个
        鲍勃

实例:http://rextester.com/OWPR50756