在C#中构建唯一对象列表的最佳方法

6

我在思考在C#中构建唯一对象列表是否更快地遵循一种模式:

选项1

  • 将所有项目添加到通用列表中
  • 调用list.Distinct函数

选项2

  • 迭代每个项目
  • 检查项目是否已经存在于列表中,如果不存在,则添加
3个回答

19
您可以使用 HashSet<T>

HashSet 类提供高性能的集合操作。一个集合是一个不包含重复元素且元素没有特定顺序的集合。

您可以通过构造函数提供自定义的IEqualityComparer<T>

谢谢,虽然这是MSDN上的一句话。 - Zbigniew
2
一个 HashSet<T> 实际上不是一个列表——它不保留顺序,也不提供索引访问。(似乎 OP 也没有意识到这个区别。) - David Moles
@DavidMoles确实HashSet<T>不是List<T>。看起来OP只是不知道HashSet,所以我提出它作为解决方案。因此,我认为,在这种情况下,“列表”一词意味着某些东西是项目的集合。 - Zbigniew

4
这是一个“该用鞋子还是砖头敲钉子”的问题。你应该使用适当的数据结构来完成这项工作,基于你需要“构建一个唯一对象列表”的要求,HashSet<T>类可以满足需求。
如果你需要以列表格式呈现项目,你可以随时在集合上调用ToList()方法。

1
实际上它是一只鞋子或玻璃瓶 - Scott Chamberlain
一个 HashSet<T> 实际上不是一个列表——它不保留顺序,也不提供索引访问。(似乎 OP 也没有意识到这个区别。) - David Moles

0
如果您关心查找唯一项的性能,请使用 Dictionary<TKey, TVale>。此外,字典需要唯一的键,因此您永远不会有重复项。

1
根据描述,他没有键值关系,因此他需要一个Set(例如HashSet),而不是Map(C#中的一种实现是Dictionary)。 - Servy
确实,我忘记了HashSet。 - jrummell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接