C# 什么会使这个HashSet实现失败?

C# 什么会使这个HashSet实现失败?,c#,hashset,C#,Hashset,为了使我的生活更容易处理字符串,我想使用一个用StringComparer.OrdinalIgnoreCase初始化的哈希集 但有时,我需要对所有项目进行操作 出于明显的性能原因,这显然不是我实现目标的方式,但我想知道这段代码是否有意义,尤其是索引的“Set”部分,以及它如何对集合造成不必要的副作用 以下是HashSet实现: public class MyHashSet<T> : HashSet<T> { public T this[int index]

为了使我的生活更容易处理字符串,我想使用一个用StringComparer.OrdinalIgnoreCase初始化的哈希集

但有时,我需要对所有项目进行操作

出于明显的性能原因,这显然不是我实现目标的方式,但我想知道这段代码是否有意义,尤其是索引的“Set”部分,以及它如何对集合造成不必要的副作用

以下是HashSet实现:

public class MyHashSet<T> : HashSet<T>
{
    public T this[int index]
    {
        get
        {
            int i = 0;
            foreach (T t in this)
            {
                if (i == index)
                    return t;
                i++;
            }
            throw new IndexOutOfRangeException();
        }
        set
        {
            int i = 0;
            foreach (T t in this)
            {
                if (i == index)
                {
                    this.RemoveWhere(element => element.Equals(t));
                    this.Add(value);
                    return;
                }
                i++;
            }
            throw new IndexOutOfRangeException();
        }
    }

    public MyHashSet()
    {

    }

    public MyHashSet(IEnumerable<T> collection)
        : base(collection)
    {

    }
    public MyHashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer)
        : base(collection, comparer)
    {

    }
    public MyHashSet(IEqualityComparer<T> comparer)
        : base(comparer)
    {

    }
}
公共类MyHashSet:HashSet
{
公共T此[int索引]
{
得到
{
int i=0;
foreach(在本例中为T)
{
如果(i==索引)
返回t;
i++;
}
抛出新的IndexOutOfRangeException();
}
设置
{
int i=0;
foreach(在本例中为T)
{
如果(i==索引)
{
this.removehere(element=>element.Equals(t));
增加(价值);
返回;
}
i++;
}
抛出新的IndexOutOfRangeException();
}
}
公共MyHashSet()
{
}
公共MyHashSet(IEnumerable集合)
:基本(集合)
{
}
公共MyHashSet(IEnumerable集合、IEqualityComparer比较器)
:base(集合、比较器)
{
}
公共MyHashSet(IEqualityComparer比较器)
:基准(比较器)
{
}
}
在什么情况下不安全

在什么情况下不安全

任何。您试图按索引访问
哈希集中的项,但它们没有逻辑索引。它们的迭代顺序是任意的,不可依赖,因此在任何情况下,该方法在概念层面上都没有意义


如果希望能够通过索引访问项目,则使用有序的集合,例如
列表

为什么要在哈希集上使用整数索引器?在没有隐式顺序的集合上使用索引是毫无意义和愚蠢的。您看到的任何有利结果都是特定于实现的,并且主要是巧合。您对
removehere
的实现是什么?@spender好的,现在您将如何对hashset集合的每个项进行操作?(除了对它进行迭代并将每个项添加到新的hashset集合中)@Servy它是hashset集合