什么是.NET中的由字符串键或数字索引查找最佳的数据结构?(What is the best dat

2019-08-03 17:14发布

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

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)。 (有关变形例中,这依赖于是否发生由索引或访问键)。

对于合理的数据量的大部分操作,这是完全不能接受的。 此外,数据结构存储元件都在一个线性载体并在散列表中,从而导致在一些内存开销。

如果通过索引检索不会经常发生,一个SortedListSortedDictionary将有更好的性能特性(通过索引访问可以通过实现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的类 (这里的通用版本以及)。



文章来源: What is the best data structure in .NET for look-up by string key or numeric index?