.NET中用于通过字符串键或者数字索引查找的最佳数据结构是什么?

时间:2020-03-06 14:45:56  来源:igfitidea点击:

我正在寻找最理想的数据结构(以提高性能和易用性),可以通过字符串键或者索引从中检索值。字典不起作用,因为我们无法真正通过索引进行检索。有任何想法吗?

解决方案

基于哈希的集合(字典,哈希表,哈希集)已经淘汰,因为我们没有索引,因为想要索引,所以我将使用嵌套的泛型:

List<KeyValuePair<K,V>>

当然,我们会丢失通过哈希获得的O(1)键查找。

有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);
    }
 }

我们正在寻找类似SortedList类的东西(这也是通用版本)。

我们需要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"]);

一句话警告。 " OrderedDictionary"除了插入和查找外,对于大多数操作而言确实具有较差的性能特征:值的删除和修改都可能需要对整个列表进行线性搜索,从而导致运行时O(n)。 (对于修改,这取决于是通过索引还是通过键进行访问。)

对于大多数具有合理数据量的操作,这是完全不能接受的。此外,数据结构将元素存储在线性向量和哈希表中,从而导致一些内存开销。

如果按索引检索不是很频繁,那么" SortedList"或者" SortedDictionary"将具有更好的性能特征(按索引访问可以通过" ElementAt"扩展方法来实现)。

另一方面,如果按索引访问是正常的,则完全停止使用字典数据结构,而只需将值存储在" List <KeyValuePair <TKey,TValue >>"中。尽管这意味着可以线性搜索键访问,但是所有其他操作都很便宜,并且在实践中很难击败整体性能。

/编辑:当然,从理论上讲,后者也是字典数据结构。我们甚至可以将其封装在实现适当接口的类中。

词典可以与linq一起使用。虽然我不知道可能的性能问题。 Dictionary.ElementAt(index);

我建议使用SortedDictionary <string,TValue>或者SortedList <string,TValue>。两者都具有O(log n)搜索性能。

引用如下:
MSDN库:

SortedList<(Of
  <(TKey, TValue>)>) uses less memory
  than SortedDictionary<(Of <(TKey,
  TValue>)>).
  
  SortedDictionary<(Of <(TKey,
  TValue>)>) has faster insertion and
  removal operations for unsorted data:
  O(log n) as opposed to O(n) for
  SortedList<(Of <(TKey, TValue>)>).
  
  If the list is populated all at once
  from sorted data, SortedList<(Of
  <(TKey, TValue>)>) is faster than
  SortedDictionary<(Of <(TKey,
  TValue>)>).

以我的经验,SortedDictionary对于大多数典型的业务场景来说是比较合适的,因为使用这种结构时,数据通常最初是未排序的,并且SortedDictionary的内存开销很少是关键。但是,如果性能对我们来说很关键,那么我建议我们同时实施并进行评估。