我需要一个集合(没有重复值)并提供快速插入时间。我还需要能够获得一个值的索引。
伪代码:
Set.Insert(value)
Set.GetIndex(value)
值相对于其他值的位置无关紧要,不需要排序。
是否有提供此功能的 C# 通用集合?或者有没有办法通过组合不同的集合类型来做到这一点?
我需要一个集合(没有重复值)并提供快速插入时间。我还需要能够获得一个值的索引。
伪代码:
Set.Insert(value)
Set.GetIndex(value)
值相对于其他值的位置无关紧要,不需要排序。
是否有提供此功能的 C# 通用集合?或者有没有办法通过组合不同的集合类型来做到这一点?
您可以使用HashSet<T>
它不允许重复并且速度很快。 http://msdn.microsoft.com/en-us/library/bb359438.aspx
如果要获取值的索引,可以将 转换HashSet
为数组并使用Array.IndexOf(value)
; 但是,HashSet
允许您将值本身用作索引,因此您可能不再需要它。
我不确定你为什么需要这样做id = search[key]
,如果这是理想的,但我会把它扔在这里......
你可以试试OrderedDictionary。
这并不理想(就您的搜索而言) - 但在内部它保留了IndexOfKey
您所需要的方法。基本上,它是一个基于ArrayList
保留一系列项目的实现+您可以Dictionary<>
快速访问等。
来源很容易找到(但出于显而易见的原因,我不会在此处链接它)-您可以使用它-或对其进行调整。
你可以围绕两个字典做一个包装器
class MySet<T> {
Dictionary<T,int> valToIndex;
Dictionary<int,T> indexToVal;
int curIndex;
Add(T newItem) {
curIndex++;
valToIndex.Add(newItem, curIndex);
indexToVal.Add(curIndex, newItem);
}
T this[int index] {
get {
return indexToVal[index];
}
}
GetIndexOf(T value) {
return valToIndex[value];
}
}
当然这并不完整,但你明白了。您可能想要添加更多错误检查。