首页 > 解决方案 > 为 Linq 中的分组项目添加编号

问题描述

我需要添加GroupID到有重复School 重复的学生Age(史蒂夫、比尔、里奇、罗伯特)。输出需要以原始列表格式 ( List<Student>) 进行转换。

List<Student> studentList = new List<Student>() { 
    new Student() { StudentID = 1, StudentName = "John", Age = 18, School = "ABC" , GroupID = 0} ,
    new Student() { StudentID = 2, StudentName = "Steve",  Age = 21, School = "DEF", GroupID = 0 } ,
    new Student() { StudentID = 3, StudentName = "Bill",  Age = 21, School = "DEF", GroupID = 0 } ,
    new Student() { StudentID = 4, StudentName = "Josh" , Age = 20, School = "DEF", GroupID = 0 },
    new Student() { StudentID = 5, StudentName = "Jack" , Age = 19, School = "JKL", GroupID = 0 },
    new Student() { StudentID = 6, StudentName = "Thomas" , Age = 18, School = "MNO", GroupID = 0 },
    new Student() { StudentID = 7, StudentName = "Rich" , Age = 22, School = "PQR", GroupID = 0 },
    new Student() { StudentID = 8, StudentName = "Robert" , Age = 22, School = "PQR", GroupID = 0 },
    new Student() { StudentID = 9, StudentName = "John" , Age = 20, School = "PQR", GroupID = 0 },
    new Student() { StudentID = 10, StudentName = "Emma" , Age = 20, School = "XYZ", GroupID = 0 }};

List<Student> outputList = studentList
    .GroupBy(s => new { s.Age, s.School })
    .Where(g => g.Count() >= 2)
    .SelectMany(g => g)
    .ToList();

输出:

任何帮助表示赞赏。

标签: c#linq

解决方案


SelectMany有一个重载传入项目的索引,所以你可以这样做:

List<Student> outputList = studentList
    .GroupBy(s => new { s.Age, s.School })
    .Where(g => g.Count() >= 2)
    .SelectMany((g, i) => g.Select(s =>
    {
        s.GroupID = i;
        return s;
    }))
    .ToList();

这确实感觉有点 hacky(我不喜欢在 Linq 中改变对象)所以我可能会做这样的事情:

List<Student> outputList = studentList
    .GroupBy(s => new { s.Age, s.School })
    .Where(g => g.Count() >= 2)
    .SelectMany((g, i) => g.Select(s => new Student
    {
        StudentID = s.StudentID,
        StudentName = s.StudentName,
        Age = s.Age,
        School = s.School,
        GroupID = i 
    }))
    .ToList();

推荐阅读