【问题标题】:Which Collection framework to sort Objects哪个 Collection 框架对对象进行排序
【发布时间】:2013-05-03 00:33:41
【问题描述】:

这是一个类

Class Emp {
      String firstName;
      String lastName;
      int sal;
      -----------
}

这里我有一个 100 名员工的列表,我想根据薪水和名字和姓氏对对象进行排序。 使用收集框架工作我该怎么做? 它与字典的工作原理有关??

【问题讨论】:

  • 你想同时对salaryfirstNamelastName 进行排序(所以如果薪水相等,那么比较名字)?或者您是否希望此时能够对salary 进行排序,然后再对lastName 进行排序?
  • 这是哪个平台?爪哇?

标签: sorting object collections dictionary


【解决方案1】:

.NET 有几个集合来完成你的任务。

列表

您可以创建一个包含所有实体的列表,并使用 Sort 方法对它们进行排序。示例如何按薪水排序(假设字段是公开的):

List<Emp> empCollection= new List<Emp>
{
    new Emp { sal = 1000, firstName = "Chris", lastName = "Bakker" },
    new Emp { sal = 1500, firstName = "Bea", lastName = "Smith" },
    // etc.
};
empCollection.Sort((a,b) => a.sal.CompareTo(b.sal));

优点和缺点:

  • 专业人士:您可以使用另一个键来收集集合。
  • 缺点:虽然列表已排序,但如果在某个键上更快,则无法搜索。

排序字典

您也可以使用 SortedDictionary。字典是键和值的组合。就您而言,价值永远是员工。它们的关键是您希望对项目进行排序的元素。按名字排序的示例:

SortedDictionary<string, Emp> empCollection= new SortedDictionary<string, Emp>
{
    {"Chris", new Emp { sal = 1000, firstName = "Chris", lastName = "Bakker" }},
    {"Bea", new Emp { sal = 1500, firstName = "Bea", lastName = "Smith" }},
    // etc.
};

优点和缺点:

  • 专业人士:列表排序后,按键查询非常快。
  • 缺点:您必须单独添加密钥,感觉就像添加重复数据一样。
  • 骗局:你不能将集合放在另一个键上;您必须创建一个新字典。

LINQ

您可以使用 LINQ 创建一个新创建和排序的列表:

List<Emp> empCollection= new List<Emp>
{
    new Emp { sal = 1000, firstName = "Chris", lastName = "Bakker" },
    new Emp { sal = 1500, firstName = "Bea", lastName = "Smith" },
    // etc.
};
List<Emp> sortedEmpCollection = empCollection.OrderBy(e => e.lastName).ToList();

优点和缺点:

  • 专业版:语法易于理解。
  • 缺点:每次都会创建一个新创建的列表(更多内存管理)。
  • 缺点:虽然列表已排序,但如果在某个键上更快,则无法搜索。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    不久前我碰巧在博客上写过这个here

    这真的取决于你需要什么,但我发现字典在类型安全方面是最好的,而且比普通的 HashTable 更快。然而,Collections 还有很多其他选项。有列表和数组列表(几乎没有人再使用它们)仅举几例。 MSDN 有大量每种类型的示例,但要获得性能,最好在谷歌上搜索一下并做出自己的决定,因为它不仅仅是关于性能的。还有可扩展性以及您是否将使用复杂类型或原始类型。在这种情况下,您似乎在使用复杂类型,但这可能不是您的总体目标。

    此外,如果您需要更改通知或延迟加载等内容,您将需要查看 IObservable 集合和 IQueryable 等内容,它是 IEnumerable 的扩展。

    我刚刚注意到您最关心的是排序。在 C# 中,最好的办法是使用 IQueryable,如果您熟悉它,则使用 LINQ。它速度很快,开销很小,可以对您拥有的任何东西进行分类。

    使用您的课程,这里只是您可以使用 LINQ 做什么的提示

    List<Emp> guy = new List<Emp>();
    
    guy.Where(x => x.firstName == "George").OrderBy(x => x.lastName);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2018-02-13
      相关资源
      最近更新 更多