根据计算值对列表进行排序

时间:2018-07-26 18:05:17

标签: c# linq

我正在努力根据需要计算的值对列表进行排序。

在大学里,我有不同的系。每个系都有许多学习区,而这些学习区又有许多学生。

当前所有这些学习领域都列在一个大列表中,但是我想根据每个部门的学生总数对列表进行排序。

public class StudyAreasClass()
{
   public string Name {get; set;}
   public string Students {get; set;}
   public string Department {get; set;}
}

在列表中,部门可能相同的四个StudyAreaClass项。因此,我需要计算系相同的学生总数。

然后,我需要对这个部门与大学中其他部门的价值进行比较。

棘手的部分是我没有固定的可比较值。所以我不知道我的名单上有哪些部门。所以我不能只说:

University
.OrderBy(s => s.Students)
.Where(c => c.Name == "NameOfADepartment")
.ToList();

我认为使用Linq对此类进行排序应该有一种更简单的方法,但是我不知道该怎么做。

有人能指出我正确的方向吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用linq查询执行此操作

    static void Main()
    {
        List<StudyAreasClass> areas = new List<StudyAreasClass>();
        areas.Add(new StudyAreasClass() { Name = "A", Students = 5, Department = "D1" });
        areas.Add(new StudyAreasClass() { Name = "B", Students = 1, Department = "D1" });
        areas.Add(new StudyAreasClass() { Name = "C", Students = 2, Department = "D2" });
        areas.Add(new StudyAreasClass() { Name = "D", Students = 10, Department = "D3" });

        var sortedList =
            from area in areas
            join sub in (from a in areas
                         group a by a.Department into g
                         select new
                         {
                             Department = g.Key,
                             StudentCount = g.Sum(x => x.Students)
                         }) on area.Department equals sub.Department
            orderby sub.StudentCount, area.Students
            group area by area.Department into g2
            select g2;



        foreach (var departmentList in sortedList)
        {
            Console.WriteLine(departmentList.Key);
            foreach (var area in departmentList)
                Console.WriteLine(area.Name);
        }

        //D2
        //C
        //D1
        //B
        //A
        //D3
        //D
    }

基本上,您使用子查询来计算按部门分组的学生总数,然后加入原始列表。然后,您可以根据总数进行排序,然后得到结果。