代码之家  ›  专栏  ›  技术社区  ›  Justin Helgerson

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

  •  2
  • Justin Helgerson  · 技术社区  · 15 年前

    基于另一个列表对包含对象列表的列表进行排序的最快方法是什么?示例如下:

    假设我有多个雇员名单。每个单子都有一个共同的属性值,比如“部门”。所以我有一个员工列表,在一个列表中,他们都有部门字符串值“Sales”。在另一个列表中,所有对象的部门值都是“财务”。然后,这些员工列表包含在一个包含所有员工的列表中。

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

    干杯!

    1 回复  |  直到 15 年前
        1
  •  1
  •   Ani    15 年前

    编辑:对不起,没注意到你提到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

    如果需要就地排序:

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

    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>>