【问题标题】:Not able to get the key of outer group in Linq无法在 Linq 中获取外部组的密钥
【发布时间】:2014-02-06 11:27:51
【问题描述】:

我通过Linq做了一个嵌套组。我根据学生姓名的第零个元素制作了第一组。第二组是根据学生姓名。我无法获得外部组的密钥,即'h' 或 'a'。请帮忙。

代码:

List<student> li = new List<practice.student>()
{
    new student(){name="harry",marks=50},
    new student(){name="harry",marks=60},
    new student(){name="hermione",marks=50},
    new student(){name="hermione",marks=60},
    new student(){name="ajax",marks=60},
    new student(){name="ajax",marks=70},
    new student(){name="abby",marks=60},
    new student(){name="abby",marks=70}
};

var query1 = li.GroupBy(t => t.name[0]).Select(t => t.GroupBy(s => s.name));

foreach (var item in query1) 
{
    Console.WriteLine(item.Select(t=>t.Key));

    foreach (var item1 in item) 
    {
        Console.WriteLine("Key:"+item1.Key);

        foreach (var item2 in item1) 
        {
            Console.WriteLine(item2.name+","+item2.marks);
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

输出:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[S
ystem.String,practice.student],System.String]
Key:harry
harry,50
harry,60

Key:hermione
hermione,50
hermione,60


System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[S
ystem.String,practice.student],System.String]
Key:ajax
ajax,60
ajax,70

Key:abby
abby,60
abby,70

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    您可以使用匿名类型,例如:

    var query1 = li.GroupBy(t => t.name[0]).Select(t => new {Letter=t.Key, Students=t.GroupBy(s => s.name)});
    
    foreach (var item in query1) 
    {
        Console.WriteLine(item.Letter);
        foreach (var item1 in item.Students) 
        {
            Console.WriteLine("Key:" + item1.Key);
            foreach (var item2 in item1) 
            {
                Console.WriteLine(item2.name+","+item2.marks);
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    
    }
    

    或者,为了缩短您的代码,只需在 foreach 循环中使用 GroupBy

    foreach(var letter in li.GroupBy(l => l.name[0]).OrderBy(l => l.Key))
    {
        Console.WriteLine("Letter:" + letter.Key);
        foreach (var student in letter.GroupBy(l => l.name).OrderBy(l => l.Key)) 
        {
            Console.WriteLine(String.Format("\n\tKey: {0}", student.Key));
            foreach (var mark in student.OrderBy(s => s.marks)) 
                Console.WriteLine(String.Format("\t\t{0}, {1}", mark.name, mark.marks));
        }
        Console.WriteLine();
    }
    

    输出:

    Letter:a
    
      Key: abby
        abby, 60
        abby, 70
    
      Key: ajax
        ajax, 60
        ajax, 70
    
    Letter:h
    
      Key: harry
        harry, 50
        harry, 60
    
      Key: hermione
        hermione, 50
        hermione, 60
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 2010-11-22
      • 2017-09-29
      • 1970-01-01
      • 2020-07-19
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多