多个列表排序

本文关键字:排序 列表 | 更新日期: 2023-09-27 18:13:57

我有两个列表

List<ClassEmpInfo> employeeDetails = GetEmployeeDetails();  //returns list of values
And ClassEmpInfo class has  following attributes.
empID,
empName,
empAddress etc.
为例:

200  John  Harmington Road.
500  Mark  Pearl Blvd.

second list

> List<EmpID> employeeSortOrder = GetEmpSortOrder();
> 
> ie. employeeSortOrder will have
> 
> Id/ranking
> 
 1 500
 2 200 
 3 300
 4 700

使用第二个列表employeeSortOrder,是否有办法对第一个列表employeeDetails进行排序,并根据employeeSortOrder返回输出?Id:

Mark Pearl大道500号
约翰哈明顿路200号

谢谢。

多个列表排序

所以您希望employeeDetails按照employeeSortOrder给出的顺序排序。

最简单的方法是从employeeSortOrder数组创建Dictionary<EmpId, int>。然后创建一个自定义排序方法,在该字典中查找内容。

// build the dictionary
Dictionary<EmpId, int> sortDict = new Dictionary<EmpId, int>();
foreach (var x in employeeSortOrder)
{
    sortDict.Add(x.Id, x.Rank);
}
// Now sort, using the dictionary
employeeDetails.Sort((e1, e2) =>
    {
        return sortDict[e1.Id].CompareTo(sortDict[e2.Id]);
    });

其工作方式是,对于排序进行的每次比较,它调用Lambda函数。Lambda函数在字典中查找员工id并返回其排名。

try this:

    employeeDetails.Sort((c1, c2) => employeeSortOrder.FindIndex(e=>e.ranking==c1.empID).CompareTo(employeeSortOrder.FindIndex(e=>e.ranking==c2.empID)));

试试这样做(使用LINQ):

employeeDetails.OrderBy(e => employeeSortOrder.First(s => s.Id == e.EmpId).Ranking);

这里假设employeeSortOrder中的EmpID.Id对应employeeDetails中的ClassEmpInfo.EmpId

一定要导入System。Linq命名空间。

MSDN for OrderBy: http://msdn.microsoft.com/en-us/library/bb534966.aspx

MSDN for First: http://msdn.microsoft.com/en-us/library/bb535050.aspx