是否有ListDictionary类的通用替代?

Bri*_*iec 16 .net c# generics performance

我正在查看一些示例代码,并在其中使用一个ListDictionary对象来存储少量数据(大约5-10个对象,但这个数字可能随时间而变化).我使用这个类的唯一问题是,与我一直在做的其他事情不同,它不是通用的.这意味着,如果我在这里错了,请纠正我,每当我从这里得到一个物体或者列举它时,就会继续施放.在较大的Dictionary<T>对象中是否有足够的开销来证明非泛型的开销ListDictionary

将在每个页面加载时枚举将使用此对象的代码,我猜这是为什么ListDictionary该类被用于其他替代方案之一的原因.这也是我希望从这个数据列表中获得最佳性能的原因.

Jar*_*Par 10

不幸的是,ListDictionary没有通用的等价物.

然而,实施它并不是非常困难.ListDictionary本质上是通过保持键/值对的链接列表并迭代它们以进行查找操作来工作的.你可以建立一个ListDictionary<TKey,TValue>通过包装一个LinkedList<T>有一些很干脆LINQ表达式.

例如

public class LinkedDictionary<TKey,TValue> {
  private LinkedList<KeyValuePair<TKey,TValue>> _list = new LinkedList<KeyValuePair<TKey,TValue>>();
  private IEqualityComparer<TKey> _comp = EqualityComparer<TKey>.Default;

  public void Add(TKey key, TValue value) { 
    _list.Add(new KeyValuePair<TKey,TValue>(key,value)); 
  }
  public TValue Get(TKey key) {  
    return _list.Where(x => _comp.Equals(x.Key,key)).First().Value;
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用LINQ会否定使用ListDictionary的几乎所有性能优势,除非计算Hash代码非常昂贵. (5认同)
  • @sluki 对象分配和委托调用与包含 for 循环的单个方法。LINQ 是为了可读性,而不是为了框架代码。 (2认同)

Car*_*nke 7

没有通用的等价物ListDictionary

如果您对这本小字典的使用不以Add和为主Remove,您可能会考虑SortedList<TKey, TValue>尽管它的名称是 ,但它实现了IDictionary<TKey, TValue>ListDictionary与单链表支持的不同,SortedList它由排序键和数组值的数组支持。