哪个Collection框架对对象进行排序

时间:2013-05-08 17:10:05

标签: sorting object collections dictionary

这是一个班级

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

这里我有100名员工的清单,我想根据工资和名字&姓。     使用收集框架工作我该怎么办?     它与字典的工作方式有关吗?

3 个答案:

答案 0 :(得分: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));

Pro's and con's:

  • Pro:您在另一把钥匙上使用该集合。
  • Con:虽然列表已排序,但您无法在密钥上搜索更快。

SortedDictionary

您也可以使用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.
};

Pro's and con's:

  • Pro:列表排序后,按键查询速度非常快。
  • Con:您必须单独添加密钥,感觉就像添加重复数据一样。
  • 骗局:你不能在另一把钥匙上取得收藏;你必须创建一个新词典。

<强> 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();

Pro's and con's:

  • Pro:语法很容易理解。
  • Con:每次都会创建一个新创建的列表(更多内存管理)。
  • Con:虽然列表已排序,但您无法在密钥上搜索更快。

答案 1 :(得分:0)

答案 2 :(得分:0)

我偶然发布了一段时间的博客here

这实际上取决于你需要什么,但我发现字典在类型安全方面是最好的,而且比普通的HashTable更快。然而,收藏品有其他多种选择。有列表和Arraylists(几乎没有人再使用这些)仅举几例。 MSDN有很多类型的例子,但为了获得性能,最好稍微谷歌并做出自己的决定,因为它不只是关于性能的全部。还有可扩展性以及您是否将使用复杂或原始类型。在这种情况下,您似乎使用的是复杂类型,但这可能不是您的总体目标。

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

我刚注意到你最担心的是排序。在C#中,最好的办法是使用IQueryable并使用LINQ(如果您熟悉它)。它很快就会有很少的开销,并会对你拥有的任何东西进行排序。

使用你的课程,这里只是你可以用LINQ

做什么的一小部分
List<Emp> guy = new List<Emp>();

guy.Where(x => x.firstName == "George").OrderBy(x => x.lastName);

希望这有帮助