【问题标题】:Sort generic list based upon a different list根据不同的列表对通用列表进行排序
【发布时间】:2010-10-29 00:03:44
【问题描述】:

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

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

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

我在 .NET 2.0 中使用 VB.NET

干杯!

【问题讨论】:

    标签: .net vb.net sorting generics


    【解决方案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 列表中。

    如果您想要就地排序:

    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&lt;List&lt;Employee&gt;&gt;

    【讨论】:

    • @Ek0nomik:已编辑。抱歉,我不懂 VB.NET,所以无法提供您需要的确切代码。
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-05-02
    • 2018-11-15
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多