-1

为了让我更轻松地处理字符串,我想使用一个用 StringComparer.OrdinalIgnoreCase 初始化的哈希集。

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

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

这是 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)
    {

    }
}

在什么情况下不安全?

4

1 回答 1

1

在什么情况下不安全?

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

如果您希望能够按索引访问项目,请使用有序集合,例如List.

于 2013-07-09T16:23:45.753 回答