Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在什么时候使用HashSet<;T>;类型?_C#_.net_Data Structures_Hashset - Fatal编程技术网

C# 我应该在什么时候使用HashSet<;T>;类型?

C# 我应该在什么时候使用HashSet<;T>;类型?,c#,.net,data-structures,hashset,C#,.net,Data Structures,Hashset,我正在探索HashSet类型,但我不明白它在集合中的位置 是否可以使用它来替换列表?我想象哈希集的性能会更好,但我看不到对其元素的单独访问 是否仅用于枚举?哈希集是通过哈希实现的集。集合是不包含重复元素的值的集合。集合中的值通常也是无序的。因此,不能使用集合来替换列表(除非您首先应该使用集合) 如果你想知道什么是一套可能是好的:任何你想摆脱重复的地方,显然。举一个稍微做作的例子,假设您有一个软件项目的10000个修订的列表,您想知道有多少人为该项目做出了贡献。您可以使用集合迭代修订列表,并将每个

我正在探索
HashSet
类型,但我不明白它在集合中的位置

是否可以使用它来替换
列表
?我想象
哈希集的性能会更好,但我看不到对其元素的单独访问

是否仅用于枚举?

哈希集是通过哈希实现的集。集合是不包含重复元素的值的集合。集合中的值通常也是无序的。因此,不能使用集合来替换列表(除非您首先应该使用集合)


如果你想知道什么是一套可能是好的:任何你想摆脱重复的地方,显然。举一个稍微做作的例子,假设您有一个软件项目的10000个修订的列表,您想知道有多少人为该项目做出了贡献。您可以使用
集合
迭代修订列表,并将每个修订的作者添加到集合中。迭代完成后,集合的大小就是您要寻找的答案。

性能是选择HashSet而不是List的一个不好的理由。相反,有什么能更好地抓住你的意图?如果顺序很重要,那么Set(或HashSet)将被输出。如果允许复制,同样如此。但是,在很多情况下,我们不关心顺序,也不希望有重复项,而这正是您想要一个集合的时候。

HashSet
是.NET framework中的一种数据结构,能够将一个对象表示为一个对象。在这种情况下,它使用哈希代码(每个项的
GetHashCode
结果)来比较集合元素的相等性

集合与列表的不同之处在于它只允许其中包含的同一元素出现一次<如果您尝试添加第二个相同的元素,code>HashSet
将只返回
false
。事实上,元素的查找非常快(
O(1)
time),因为内部数据结构只是一个哈希表

如果您想知道该使用哪一个,请注意,在适当的位置使用
列表
,而
哈希集
并不是最大的错误,尽管这可能会导致在收藏中存在不需要的重复项时出现问题。更重要的是,查找(项目检索)的效率要高得多-理想情况下是
O(1)
(用于完美的扣合)而不是
O(n)
时间-这在许多情况下都非常重要。

List
用于存储有序的信息集。如果知道列表中元素的相对顺序,则可以在固定时间内访问它们。但是,要确定元素在列表中的位置或检查它是否存在于列表中,查找时间是线性的。另一方面,
HashedSet
不保证存储数据的顺序,因此为其元素提供恒定的访问时间

顾名思义,
HashedSet
是一种实现的数据结构。对数据结构进行了优化,以实现集合操作(即并集、差分、相交),这是传统列表实现无法实现的


因此,选择使用哪种数据类型实际上取决于您试图对应用程序执行的操作。如果您不关心元素在集合中的顺序,只想枚举或检查是否存在,请使用
HashSet
。否则,考虑使用<代码>清单>代码>或另一个合适的数据结构。

< P>可能是HASSET最常见的用法是查看它们是否包含某个元素,它接近于O(1)操作(假设一个足够强的哈希函数),而不是包含包含O(n)的列表的列表。(和排序集,其值为O(log n))。因此,如果您进行大量检查,检查某个项是否包含在某个列表中,HAHSSET可能会提高性能。如果您只对它们进行迭代,则不会有太大差异(对整个集合进行迭代为O(n),与列表和哈希集一样,在添加项时会有更多的开销)


和否,你不能索引一个集合,无论如何它都没有意义,因为集合不是排序的。如果你添加了一些项,集合就不会记得哪一个是第一个,第二个等等。

总之,任何时候你都想使用字典(或者一个字典,其中S是T的属性),那么你应该考虑一个哈希集。(或HashSet+在T上实现IEquatable,它等于在S上实现IEquatable)

HashSet的重要一点就在名称中:它是一个集合。使用单个集合可以做的唯一事情是确定它的成员是什么,并检查一个项是否是成员

询问是否可以检索单个元素(例如,
set[45]
)会误解集合的概念。集合中没有第45个元素。集合中的项目没有顺序。集合{1,2,3}和{2,3,1}他们在各个方面都是相同的,因为他们拥有相同的成员资格,而成员资格才是最重要的

迭代
HashSet
有些危险,因为这样做会对集合中的项施加顺序。该顺序实际上不是集合的属性。您不应该依赖它。如果集合中项的顺序对您很重要,则该集合不是集合


集合非常有限,并且具有唯一的成员。另一方面,它们非常快。

下面是一个我使用
哈希集的真实示例:

我的UnrealScript文件语法高亮显示的一部分是一个新功能。我需要能够判断
@
\
命令是否有效,以确定是否以灰色(有效)或红色(无效)显示它。我有一个所有有效命令的
HashSet
,因此每当我在lexer中点击
@xxx
标记时,我使用
validCommands.Contains(tokenText)
作为我的O(1)有效性检查。我
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
    // Methods
    void Add(T item);
    void Clear();
    bool Contains(T item);
    void CopyTo(T[] array, int arrayIndex);
    bool Remove(T item);

    // Properties
   int Count { get; }
   bool IsReadOnly { get; }
}
public interface IList<T> : ICollection<T>
{
    // Methods
    int IndexOf(T item);
    void Insert(int index, T item);
    void RemoveAt(int index);

    // Properties
    T this[int index] { get; set; }
}
List<string> duplicatedEnumrableStrings = new List<string> {"abc", "ghjr", "abc", "abc", "yre", "obm", "ghir", "qwrt", "abc", "vyeu"};
HashSet<string> uniqueStrings = new HashSet(duplicatedEnumrableStrings);