根据不同的列表对通用列表进行排序

时间:2010-10-29 00:03:45

标签: .net vb.net sorting generics

根据另一个列表,对包含对象列表的列表进行排序的最快方法是什么?一个例子如下:

说我有多个员工名单。每个单独的列表都有一个共同的属性值,比如说“部门”。所以我有一份员工列表,在一个列表中,他们都有部门字符串值“Sales”。在另一个列表中,所有对象的部门值都为“Finance”。然后,这些员工列表将包含在一个列表中,这些列表将所有员工都包含在内。

我有第二个列表,它应该驱动员工列表的排序顺序。第二个列表只包含一个字符串列表,如“财务”,“销售”,“IT”等。我希望我的客户列表按“财务”,“销售”等顺序排序。

我在.NET 2.0中使用VB.NET

干杯!

1 个答案:

答案 0 :(得分:1)

编辑:对不起,没注意到你提到过VB。

这不是最有效的方法,但这是一种方法:

List<List<Employee>> employeeLists = ...
List<string> departments = ...

// implicitly List<List<Employee>>
var sortedEmpLists = employeeLists
                   .OrderBy(eList => departments.IndexOf(eList.First().Department))
                   .ToList();

基本上,我们的想法是宣布员工订单的子列表取决于其第一个成员部门的顺序。当然,这取决于以下假设,我认为在您的场景中也是如此:

  1. 子列表中的所有员工都属于同一个部门。
  2. 所有员工子列表至少包含一名员工。
  3. 员工列表中提到的所有部门都显示在departments列表中。
  4. 如果您想要就地排序:

    employeeLists.Sort((eList1, eList2) =>
                      departments.IndexOf(eList1.First().Department)
                                 .CompareTo(departments.IndexOf(eList2.First().Department)));
    

    编辑:这是一个.NET 2.0版本(C#):

    Comparison<List<Employee>> comp = 
                                delegate(List<Employee> eList1, List<Employee> eList2)
                                {
                                   string d1 = departments.IndexOf(eList1[0].Department);
                                   string d2 = departments.IndexOf(eList2[0].Department);
                                   return d1.CompareTo(d2);                                         
                                };
    employeeLists.Sort(comp);
    

    当然,您也可以随时写一个IComparer<List<Employee>>