【问题标题】:Grouping/sorting with Linq使用 Linq 进行分组/排序
【发布时间】:2021-06-30 03:23:32
【问题描述】:

我有这个学生成绩列表:

Grade Student
10 John
10 Mary
9 Peter
9 Allison

我想这样对它们进行分组:

Grade Students
10 John, Mary
9 Peter, Allison

所以我得到了这个 Linq 命令:

var gradesAndStudents = studentsGrades.GroupBy(p => p.grade, p => p.student,
    (key, g) => new { Grade = key, Students = g.ToList() });

所以现在结果被分组和排序,成绩显示所有学生的成绩:

Grade Students
10 10, John
10, Mary
9 9, Peter
9, Allison

但我如何才能将学生的姓名仅作为字符串获取?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    试试这个

    var gradesAndStudents = from p in studentsGrades
                  group p.student by p.grade into g
                  select new { Grade= g.Key, Students =string.Join(", ", g.ToList()) };
    

    【讨论】:

    • 嗨,feras,如果你也可以添加排序会更好: var gradesAndStudents = from p in studentsGrades orderby p.Brands group p.student by p.grade into g select new { Grade= g.Key, Students =string.Join(", ", g.ToList()) };
    【解决方案2】:

    我会这样做:

    var gradesAndStudents = studentsGrades
       .GroupBy(p => p.grade, p => p.student, 
               (key, g) => new { Grade = key, Students = string.Join(", ", g.ToList()) });
    

    获得学生名单后,您可以通过string.Join 加入他们

    【讨论】:

    • 嗨 Nateous,这对我不起作用,我仍然将每个前卫/学生分开。
    【解决方案3】:

    你可以试试这个

    var studentsByGrades = studentGrades.GroupBy(sg => sg.Grade).Select(sg => KeyValuePair.Create(sg.Key, sg.Select(s => s.Name))).ToList();
    

    在这种情况下,studentsByGrades 将是一个键值对列表,其中键为 grade 和该年级学生姓名的值列表,即字符串列表。或者你可以试试这样的

     var studentsByGrades = studentGrades.GroupBy(sg => sg.Grade).ToDictionary(sg => sg.Key, sg => sg.Select(s => s.Name));
    

    在第二个示例中,studentsByGrades 将是一个字典。字典的键是成绩,值是包含该成绩学生姓名的列表。

    【讨论】:

    • 嗨,Aton,这对我不起作用,第一种方法给出了关于 KayValuePair 的错误,需要 2 个类型参数第二种方法我每个年级都是分开的,但学生也是,所以不在一串。
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多