为了让我的生活更容易处理字符串,我想使用用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)
{
}
}
在什么条件下不安全?
答案 0 :(得分:1)
在什么条件下不安全?
不限。您尝试按索引访问HashSet
中的项目,但它们没有逻辑索引。它们被迭代的顺序是任意的,不能依赖,所以在任何情况下,这个方法在概念层面都没有意义。
如果您希望能够按索引访问项目,请使用已订购的集合,例如List
。