【问题标题】:Using Linq to Sort Students within Groups and then Rearrange Group Order使用 Linq 对组内的学生进行排序,然后重新排列组顺序
【发布时间】:2020-03-18 11:23:53
【问题描述】:

我想要-

  • 在每个组中按升序对学生进行排序(例如:第 1 组中的 Jack、John 和 Peter 等)
  • 按第一项升序排列所有已排序的组(例如:第 3、2 和 1 组)

收藏

public class StudentInfo
{
  public string Student { get; set; }
  public string University { get; set; }
  public int GroupID { get; set; }
  public bool IsQualified {get; set;}
}

List<StudentInfo> studentsList = new List<StudentInfo>();

StudentsList.Add( new StudentInfo { Student="John", University="ABC", GroupID = 1, IsQualified=False});
StudentsList.Add( new StudentInfo { Student="Jack", University="DEF", GroupID = 1, IsQualified=False} );
StudentsList.Add( new StudentInfo { Student="Peter", University="GHI", GroupID = 1, IsQualified=False} );

StudentsList.Add( new StudentInfo { Student="Olivia", University="ABC", GroupID = 2, IsQualified=False} );
StudentsList.Add( new StudentInfo { Student="Donald", University="JKL", GroupID = 2, IsQualified=False} );

StudentsList.Add( new StudentInfo { Student="Adam", University="GHI", GroupID = 3, IsQualified=False} );
StudentsList.Add( new StudentInfo { Student="Jacob", University="ABC", GroupID = 3, IsQualified=False} );

预期输出

Group 3:
Adam
Jacob

Group 2:
Donald
Olivia

Group 1:
Jack
John
Peter

伪代码

var results = studentsList
 .GroupBy(x => x.GroupID)
 .SelectMany(g => g.OrderBy(x => x.Student)).ToList();

我不知道除此之外还能写什么。请帮帮我。

【问题讨论】:

  • 是否还要对每个组内的学生姓名进行排序?

标签: c# linq


【解决方案1】:

所以 Linq 查询已经为您排序了数据,但现在您需要显示它。我已经测试过了,它显示了您的预期输出。代码如下:

  static void Main(string[] args)
    {

        List<StudentInfo> studentsList = new List<StudentInfo>();

        studentsList.Add(new StudentInfo { Student = "John", University = "ABC", GroupID = 1, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Jack", University = "DEF", GroupID = 1, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Peter", University = "GHI", GroupID = 1, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Olivia", University = "ABC", GroupID = 2, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Donald", University = "JKL", GroupID = 2, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Adam", University = "GHI", GroupID = 3, IsQualified = false });
        studentsList.Add(new StudentInfo { Student = "Jacob", University = "ABC", GroupID = 3, IsQualified = false });

        var results = studentsList.OrderBy(x => x.Student)
            .GroupBy(x => x.GroupID);


        foreach (var group in results)
        {
            Console.WriteLine(group.Key);

            foreach (var student in group)
            {
                Console.WriteLine(student.Student);

            }

            Console.WriteLine(Environment.NewLine);
        }
    }

public class StudentInfo
{
    public string Student { get; set; }
    public string University { get; set; }
    public int GroupID { get; set; }
    public bool IsQualified { get; set; }
}

【讨论】:

    【解决方案2】:
     var groupedStudents = studentsList.GroupBy(a => a.GroupID, (key, Students) => new
     {
         Key = key,
         StudentsList = Students.ToList()
     }).OrderByDescending(a => a.Key).ToList();
     foreach (var item in groupedStudents)
     {
         Console.WriteLine("Group " + item.Key + ":");
         foreach (var stdList in item.StudentsList.OrderBy(a => a.Student))
         {
             Console.WriteLine(stdList.Student);
         }
         Console.WriteLine();
     }
    
    

    输出:

    Group 3:
    Adam
    Jacob
    
    Group 2:
    Donald
    Olivia
    
    Group 1:
    Jack
    John
    Peter
    

    【讨论】:

    • 你错过在这里按名字订购学生
    【解决方案3】:

    根据 Krish 评论更新

    按第一项升序排列所有已排序的组

    var results = StudentsList
        .OrderBy(x => x.Student)
        .GroupBy(x => x.GroupID)
        .SelectMany(x => x.OrderBy(y => y.Student))
        .ToList();
    

    根据 YoKidYo 评论更新

    var results = StudentsList
         .GroupBy(x => x.GroupID)
         .OrderByDescending(x => x.Key)
         .SelectMany(x => x.OrderBy(y => y.Student))
         .ToList();
    
    foreach (var item in results)
    {
        Console.WriteLine(item.GroupID + " : " + item.Student);
    }
    
    

    结果

    3 : Adam
    3 : Jacob
    2 : Donal
    2 : Olivi
    1 : Jack
    1 : John
    1 : Peter
    

    旧代码

    您可以按降序Keys(groupId) 排序,并按升序每个组内的学生姓名排序,如以下代码:

    var results = StudentsList
         .GroupBy(x => x.GroupID)
         .OrderByDescending(x => x.Key)
         .Select(x => new { Group = "Group " + x.Key, Students = x.Select(y => y.Student).OrderBy(z => z).ToList() })
         .ToList();
    

    希望对你有所帮助。

    【讨论】:

    • 不知道他们为什么对此投了反对票。您的查询很好,除了基于给定问题的逻辑上的小缺陷。按子组的第一个元素排序。例如。如果您交换 2 和 3 groupid,它应该按 Group 2,3,1 的顺序显示
    • @Sajid,是否可以更新原始集合而不是迭代?谢谢。
    • 你能检查我的更新吗,如果理解正确,你想第一次按组 id 排序,第二次按学生姓名排序?
    • @YoKidYo,我在这里看到一条评论 ;),然后我添加循环并导致更新的代码
    • 别介意...我这边有一个错误,您的代码没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2019-02-22
    • 2023-04-03
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多