之间的区别是什么。<T> 和列表<T>?
-
29-10-2019 - |
题
你能解释之间的区别是什么 HashSet<T>
和 List<T>
中。净?
也许你可以解释一个例子是在什么情况下 HashSet<T>
应该是首选对 List<T>
?
解决方案
不同于列表<> ...
-
哈希集是一个没有重复成员的列表。
-
由于HashSet被限制为仅包含唯一条目,因此内部结构已针对搜索进行了优化(与列表相比)-速度明显更快
-
添加到HashSet中会返回一个布尔值-如果由于Set中已经存在添加而导致添加失败,则返回false。
-
可以对Set:Union / Intersection / IsSubsetOf等执行数学集合运算。
-
HashSet不仅实现IList,而且还实现ICollection
-
您不能将索引与HashSet一起使用,只能使用枚举器。
使用HashSet的主要原因是,如果您有兴趣执行Set操作。
给出2套:hashSet1和hashSet2 通用标签 与使用LINQ的等效操作相比,
飞行。写也很整洁!
其他提示
HashSet<T>
是一个旨在为您提供O(1)
查找以进行遏制的类(即,此集合是否包含特定对象,并迅速告诉我答案)。
List<T>
是一个类,旨在为您提供具有O(1)
随机访问权限的集合,该集合具有可以动态增长的功能(请考虑动态数组)。您可以在O(n)
时间内测试遏制(除非对列表进行排序,然后您可以在O(log n)
时间内进行二进制搜索)。
也许您可以举一个例子来说明在哪种情况下应优先使用
HashSet<T>
而不是List<T>
当您要测试基因编码标签中的收容措施时。
为了更加精确,让我们通过示例进行演示,
您不能像以下示例中那样使用HashSet。 通用标签
hashSet1[i]
会产生错误:
无法将带有[]的索引应用于类型的表达式 'System.Collections.Generic.HashSet'
您可以使用foreach语句: 通用标签
您不能将重复项添加到HashSet中,而List允许您这样做,并且 将项目添加到HashSet时,可以检查它是否包含该项目。 通用标签
HashSet具有一些有用的功能,例如
IntersectWith
,UnionWith
,IsProperSubsetOf
,ExceptWith
,SymmetricExceptWith
等。
IsProperSubsetOf
: 通用标签
UnionWith
: 通用标签
IntersectWith
: 通用标签
ExceptWith
: 通用标签
SymmetricExceptWith
: 通用标签
顺便说一句,该顺序未保留在HashSets中。在该示例中,我们最后添加了元素“ 2”,但它是第二顺序的: 通用标签
使用 List<T>
当你想到:
- 存储的项目集合在一定的顺序。
如果你知道的索引你想要的项目(而不是项目的价值本身)检索 O(1)
.如果你不知道的索引,查找项目需要更多的时间, O(n)
对于一个未分类收集。
使用 Hashset<T>
当你想到:
- 快找到出,如果一定的对象是包含在一个集合。
如果你知道名字的事情你想要找到、查找的是 O(1)
(这是'哈希'部分)。它不能保持订购喜欢的 List<T>
不,你不能储存重复(加复没有影响,这是"设置"部分)。
一个例子的时候使用 Hashset<T>
会有如果你想找出如果一个字放在一个拼字游戏是一个有效的词在英语(或其它语言)。甚至更好的是,如果你想建立一个网络服务使用的所有情况的一个在线版本,这样的游戏。
一个 List<T>
将是一个良好的数据结构创建的记分牌,以跟踪播放的成绩。
列表是有序列表。是
- 通过整数索引访问
- 可以包含重复项
- 订单可预测
HashSet是一个集合。它:
- 可以阻止重复的项目(请参阅添加(T))
- 不保证项目在集合中的顺序
- 您希望对集合例如,IntersectWith,IsProperSubsetOf,UnionWith进行操作。
当您要访问集合时,
List更合适,就像它可以在其中添加,插入和删除项目的数组一样。如果您希望将集合视为顺序不重要的项目的“袋子”,或者要使用IntersectWith或UnionWith等操作将其与其他集合进行比较,则HashSet是更好的选择。
列表不一定是唯一的,而哈希集是唯一的。
列表是T型对象的有序集合,与数组不同,您可以添加和删除条目。
您将使用一个列表,在该列表中您想按存储它们的顺序引用这些成员,并且您按位置而不是项目本身来访问它们。
HashSet就像字典一样,项本身就是键以及值,因此不能保证顺序。
您将使用HashSet来检查对象是否在集合中
如果您决定将这些数据结构应用于数据驱动的开发中的实际使用情况,则HashSet对于测试针对数据适配器源的复制以进行数据清理和迁移非常有用。
此外,如果使用DataAnnotations类,则可以在类属性上实现键逻辑,并使用HashSet有效地控制自然索引(是否聚集),这在List实现中非常困难。
使用列表的一个强大选择是在视图模型上为多种媒体实现泛型,例如,将类列表发送到DropDownList Helper的MVC视图,以及通过WebApi作为JSON构造发送。该列表允许典型的类收集逻辑,并为采用类似“接口”的方法为不同媒介计算单个视图模型保留了灵活性。