C# 使用Linq对组内的学生进行排序,然后重新排列组顺序

C# 使用Linq对组内的学生进行排序,然后重新排列组顺序,c#,linq,C#,Linq,我想- 在每组内按升序对学生进行排序(例如:第一组中的杰克、约翰和彼得等) 按第一项按升序排列所有已排序的组(例如:组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;}

我想-

  • 在每组内按升序对学生进行排序(例如:第一组中的杰克、约翰和彼得等)
  • 按第一项按升序排列所有已排序的组(例如:组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} );
伪代码

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

除此之外,我不知道该写些什么。请帮助我。

因此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; }
}
static void Main(字符串[]args)
{
List studentsList=新列表();
添加(newstudentinfo{Student=“John”,University=“ABC”,GroupID=1,IsQualified=false});
添加(newstudentinfo{Student=“Jack”,University=“DEF”,GroupID=1,IsQualified=false});
添加(新的StudentInfo{Student=“Peter”,University=“GHI”,GroupID=1,IsQualified=false});
添加(新的StudentInfo{Student=“Olivia”,University=“ABC”,GroupID=2,IsQualified=false});
添加(newstudentinfo{Student=“Donald”,University=“JKL”,GroupID=2,IsQualified=false});
添加(新的StudentInfo{Student=“Adam”,University=“GHI”,GroupID=3,IsQualified=false});
添加(newstudentinfo{Student=“Jacob”,University=“ABC”,GroupID=3,IsQualified=false});
var results=studentsList.OrderBy(x=>x.Student)
.GroupBy(x=>x.GroupID);
foreach(结果中的var组)
{
控制台写入线(组键);
foreach(学生分组)
{
Console.WriteLine(student.student);
}
Console.WriteLine(Environment.NewLine);
}
}
公共班级学生信息
{
公共字符串Student{get;set;}
公共字符串{get;set;}
public int GroupID{get;set;}
公共bool是限定的{get;set;}
}

根据Krish评论更新:

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

var results = StudentsList
    .OrderBy(x => x.Student)
    .GroupBy(x => x.GroupID)
    .SelectMany(x => x.OrderBy(y => y.Student))
    .ToList();
根据横滨评论更新

Group 3:
Adam
Jacob

Group 2:
Donald
Olivia

Group 1:
Jack
John
Peter
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);
}

结果

旧代码

var results = studentsList
 .GroupBy(x => x.GroupID)
 .SelectMany(g => g.OrderBy(x => x.Student)).ToList();
您可以按降序排列
(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();
我希望这能帮到你。

var-groupedStudents=studentsList.GroupBy(a=>a.GroupID,(key,Students)=>new
{
键=键,
StudentsList=Students.ToList()
}).OrderByDescending(a=>a.Key).ToList();
foreach(groupedStudents中的变量项)
{
Console.WriteLine(“组”+项.Key+“:”);
foreach(item.StudentsList.OrderBy中的var stdList(a=>a.Student))
{
Console.WriteLine(标准列表学生);
}
Console.WriteLine();
}
输出:

Group 3:
Adam
Jacob

Group 2:
Donald
Olivia

Group 1:
Jack
John
Peter

你错过了按名字排列学生的顺序吗?你想在每个小组中也排列学生的名字吗?不知道他们为什么要放弃投票。。除了基于给定问题的逻辑上的一个小缺陷外,您的查询是好的。根据子组的第一个元素排序。例如,如果交换2和3组ID,则应按组2,3的顺序显示,1@Sajid,是否可以更新原始集合而不是迭代?谢谢。你能检查我的更新吗?如果理解正确,你想第一次按组id排序,第二次按学生姓名排序吗?@Yokidoo,我在这里看到一条评论;),然后我添加循环,并在更新的代码结果不介意。。。我这边有个错误,你的代码没有问题。