C# 使用LINQ对列表及其所有嵌套对象进行排序
有一个组织有几个部门,每个部门有几个员工 我创建了以下对象模型:C# 使用LINQ对列表及其所有嵌套对象进行排序,c#,list,linq,sorting,C#,List,Linq,Sorting,有一个组织有几个部门,每个部门有几个员工 我创建了以下对象模型: public class Organisation { public int Code { get; set; } public string Type { get; set; } public string Name { get; set; } public List<Department> Departments { get; set; } } public class Depar
public class Organisation
{
public int Code { get; set; }
public string Type { get; set; }
public string Name { get; set; }
public List<Department> Departments { get; set; }
}
public class Department
{
public int Code { get; set; }
public string Name { get; set; }
public List<Employee> Employees { get; set; }
}
public class Employee
{
public int Code { get; set; }
public string Name { get; set; }
}
公共类组织
{
公共整数代码{get;set;}
公共字符串类型{get;set;}
公共字符串名称{get;set;}
公共列表部门{get;set;}
}
公共课系
{
公共整数代码{get;set;}
公共字符串名称{get;set;}
公共列表雇员{get;set;}
}
公营雇员
{
公共整数代码{get;set;}
公共字符串名称{get;set;}
}
现在,我有了这些组织的列表,我想使用LINQ对输出进行排序/排序,如下所示:
1) 组织:按代码和名称排序
2) 部门:按代码和名称排序
3) 员工:按代码和名称排序
下面是我填充的一些测试数据:
var britishTelecomLtd = new Organisation
{
Code = 8,
Name = "British Telecom Ltd",
Type = "Institutional",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Finance",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Accounts",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
}
}
};
var virginMediaLtd = new Organisation
{
Code = 5,
Name = "Virgin Media Ltd",
Type = "Institutional",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Sales",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Support",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
}
}
};
var pcWorldLtd = new Organisation
{
Code = 18,
Name = "PC World Ltd",
Type = "Retail",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Marketing",
Employees = new List<Employee>
{
new Employee
{
Code = 15,
Name = "Jane"
},
new Employee
{
Code = 22,
Name = "John"
},
new Employee
{
Code = 16,
Name = "Mark"
}
}
},
new Department
{
Code = 5,
Name = "Customer Services",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Kelly"
},
new Employee
{
Code = 2,
Name = "Jenny"
},
new Employee
{
Code = 6,
Name = "Tricia"
}
}
}
}
};
var blueCatLtd = new Organisation
{
Code = 3,
Name = "Blue Cat Music Ltd",
Type = "Retail",
Departments = new List<Department>
{
new Department
{
Code = 6,
Name = "Sales",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Peter"
},
new Employee
{
Code = 2,
Name = "James"
},
new Employee
{
Code = 6,
Name = "Andrew"
}
}
},
new Department
{
Code = 5,
Name = "Warehouse",
Employees = new List<Employee>
{
new Employee
{
Code = 5,
Name = "Andy"
},
new Employee
{
Code = 2,
Name = "Robert"
},
new Employee
{
Code = 6,
Name = "Dave"
}
}
}
}
};
var organisations = new List<Organisation>
{
britishTelecomLtd,
virginMediaLtd,
pcWorldLtd,
blueCatLtd
};
var BritishTelecommit Ltd=新机构
{
代码=8,
Name=“英国电信有限公司”,
Type=“机构”,
部门=新列表
{
新部门
{
代码=6,
Name=“财务”,
雇员=新名单
{
新员工
{
代码=5,
Name=“彼得”
},
新员工
{
代码=2,
Name=“詹姆斯”
},
新员工
{
代码=6,
Name=“安德鲁”
}
}
},
新部门
{
代码=5,
Name=“账户”,
雇员=新名单
{
新员工
{
代码=15,
Name=“Jane”
},
新员工
{
代码=22,
Name=“约翰”
},
新员工
{
代码=16,
Name=“Mark”
}
}
}
}
};
var virginMediaLtd=新组织
{
代码=5,
Name=“维珍传媒有限公司”,
Type=“机构”,
部门=新列表
{
新部门
{
代码=6,
Name=“销售”,
雇员=新名单
{
新员工
{
代码=5,
Name=“彼得”
},
新员工
{
代码=2,
Name=“詹姆斯”
},
新员工
{
代码=6,
Name=“安德鲁”
}
}
},
新部门
{
代码=5,
Name=“支持”,
雇员=新名单
{
新员工
{
代码=15,
Name=“Jane”
},
新员工
{
代码=22,
Name=“约翰”
},
新员工
{
代码=16,
Name=“Mark”
}
}
}
}
};
var legalEntitiesCollectionByType = new Dictionary<string, ICollection<Organisation>>
{
{
"Institutional", organisations
.Where(x => x.Type == "Institutional")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.ToList()
},
{
"Retail", organisations
.Where(x => x.Type == "Retail")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.ToList()
}
};
{
"Retail", organisations
.Where(x => x.Type == "Retail")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.Select(x => new Organisation {
x.Code
, x.Type
, x.Name
, Departments = x.Departmentsd.OrderBy(d => d.Code).ThenBy(d => d.Name)
.Select(d => new Department {
d.Code
, d.Name
, Employees = d.Employees.OrderBy(e => e.Code).ThenBy(e => e.Name).ToList()
})
}).ToList()
}
private Organisation SortedOrganisation(Organisation x) {
return new Organisation {
x.Code
, x.Type
, x.Name
, Departments = x.Departmentsd.OrderBy(d => d.Code).ThenBy(d => d.Name)
.Select(d => new Department {
d.Code
, d.Name
, Employees = d.Employees.OrderBy(e => e.Code).ThenBy(e => e.Name).ToList()
})
};
}
...
var legalEntitiesCollectionByType = new Dictionary<string, ICollection<Organisation>>
{
{
"Institutional", organisations
.Where(x => x.Type == "Institutional")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.Select(SortedOrganisation)
.ToList()
},
{
"Retail", organisations
.Where(x => x.Type == "Retail")
.OrderBy(x => x.Code).ThenBy(x => x.Name)
.Select(SortedOrganisation)
.ToList()
}
};
public class Department
{
...
public SortedList<Tuple<int, string>, Employee> Employees { get; set; }
}
Employees = new SortedList<Tuple<int, string>, Employee>(new EmployeeKeyComparer());
public class EmployeeKeyComparer : IComparer<Tuple<int, string>>
{
public int Compare(Tuple<int, string> x, Tuple<int, string> y)
{
if (x.First == y.First)
return StringComparer.Ordinal.Compare(x.Second, y.Second);
else
return x.First.CompareTo(y.First);
}
}
organisations.ToList().ForEach(o => o.Departments = o.Departments.OrderBy(d => d.Code).ToList());
organisations.SelectMany(o => o.Departments).ToList().ForEach(d => d.Employees = d.Employees.OrderBy(e => e.Name).ToList());
var legalEntitiesCollectionByType = new Dictionary<string, ICollection<Organisation>>
{
{
"Institutional", organisations
.Where(x => x.Type == "Institutional")
.ToList()
},
{
"Retail", organisations
.Where(x => x.Type == "Retail")
.ToList()
}
};
organisations.ToList().ForEach(o => o.Departments.Sort(CreateCustomComparison));
organisations.SelectMany(o => o.Departments).ToList().ForEach(d => d.Employees.Sort(CreateCustomComparison));
var legalEntitiesCollectionByType = new Dictionary<string, ICollection<Organisation>>
{
{
"Institutional", organisations
.Where(x => x.Type == "Institutional")
.ToList()
.Select(o => new Organisation{Code = x.Code,Departaments = x.Departaments.OrderBy(c => c).ToList() }).ToList()
}
}
organisations = organisations.OrderBy(org =>
{
org.Departments = org.Departments
.OrderBy(dept =>
{
dept.Employees = dept.Employees
.OrderBy(employee => employee.Code)
.ThenBy(employee=>employee.Name);
return dept.Code;
})
.ThenBy(dept=>dept.Name);
return org.Code;
})
.ThenBy(org=>org.Name);