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

时间:2013-07-09 16:19:46

标签: c# hashset

为了让我的生活更容易处理字符串,我想使用用StringComparer.OrdinalIgnoreCase初始化的hashset。

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

这显然不是我出于明显的性能原因实现目标的方式,但我想知道这段代码是否有意义,特别是索引的“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)
    {

    }
}

在什么条件下不安全?

1 个答案:

答案 0 :(得分:1)

  

在什么条件下不安全?

不限。您尝试按索引访问HashSet中的项目,但它们没有逻辑索引。它们被迭代的顺序是任意的,不能依赖,所以在任何情况下,这个方法在概念层面都没有意义。

如果您希望能够按索引访问项目,请使用已订购的集合,例如List