我在寻找最为理想的数据结构(性能和易用性),从该值可通过字符串键或索引进行检索。 字典不起作用,因为你不能真正通过索引检索。 有任何想法吗?
Answer 1:
您希望OrderedDictionary类。 您将需要包括System.Collections.Specialized命名空间:
OrderedDictionary od = new OrderedDictionary();
od.Add("abc", 1);
od.Add("def", 2);
od.Add("ghi", 3);
od.Add("jkl", 4);
// Can access via index or key value:
Console.WriteLine(od[1]);
Console.WriteLine(od["def"]);
Answer 2:
有System.Collections.ObjectModel。 KeyedCollection <串,TItem>,它自Collection <TItem>导出。 检索是O(1)。
class IndexableDictionary<TItem> : KeyedCollection<string, TItem>
{ Dictionary<TItem, string> keys = new Dictionary<TItem, string>();
protected override string GetKeyForItem(TItem item) { return keys[item];}
public void Add(string key, TItem item)
{ keys[item] = key;
this.Add(item);
}
}
Answer 3:
一个字的警告。 该OrderedDictionary
有除插入和查找大多数操作非常糟糕的性能特点 :一值的两个去除和修改,可能需要整个列表的线性搜索,导致运行时间为O(n)。 (有关变形例中,这依赖于是否发生由索引或访问键)。
对于合理的数据量的大部分操作,这是完全不能接受的。 此外,数据结构存储元件都在一个线性载体并在散列表中,从而导致在一些内存开销。
如果通过索引检索不会经常发生,一个SortedList
或SortedDictionary
将有更好的性能特性(通过索引访问可以通过实现ElementAt
扩展方法)。
如果,另一方面,通过索引访问是常态,那么停止使用字典的数据结构和产品总数简单地存储在你的价值观List<KeyValuePair<TKey, TValue>>
。 虽然这意味着通过密钥访问线性搜索,其他所有操作都非常便宜,整体性能是很难在实践中被击败。
/编辑:当然,后者也是在理论意义上的字典的数据结构。 你甚至可以封装在开展相应的接口的类。
Answer 4:
基于散列的集合(字典,哈希表,HashSet的)的,因为你不会有一个指标,因为你想要一个指标,我会使用一个嵌套泛型:
List<KeyValuePair<K,V>>
当然,你失去了O(1)您使用散列得到键查找。
Answer 5:
词典可以使用LINQ工作。 虽然我不知道可能的性能问题。 Dictionary.ElementAt(索引);
Answer 6:
我建议使用SortedDictionary <串,TValue>中或排序列表<串,TValue>中。 两者都有O(log n)的搜索性能。
的差异,从引用的MSDN库 :
排序列表<(中<(TKEY的,TValue>中)>)使用比SortedDictionary存储器更少<(中<(TKEY的,TValue>中)>)。
SortedDictionary <(中<(TKEY的,TValue>中)>)具有用于未排序的数据更快地插入和移除操作:用于排序列表O(log n)的,而不是为O(n)<(中<(TKEY的,TValue>中)>)。
如果列表被从排序的数据填充全部一次,排序列表<(中<(TKEY的,TValue>中)>)比SortedDictionary更快<(中<(TKEY的,TValue>中)>)。
根据我的经验SortedDictionary是最典型的业务场景更充足,因为使用结构,这样当数据通常最初未排序,和SortedDictionary的内存开销很少是至关重要的。 但是,如果性能是你的关键,我建议你同时实现并做测量。
Answer 7:
您正在寻找的东西像SortedList的类 (这里的通用版本以及)。