.net 是否有ListDictionary类的通用替代方法?

cs7cruho  于 2023-01-27  发布在  .NET
关注(0)|答案(5)|浏览(131)

我查看了一些示例代码,其中使用了ListDictionary对象来存储少量数据(大约5-10个对象左右,但这个数字可能会随着时间而改变)。我使用这个类的唯一问题是,与我所做的其他事情不同,它不是通用的。这意味着,如果我错了请纠正我,每次我从这里得到一个对象,或者枚举它的时候,都会有强制类型转换在进行,在更大的Dictionary<T>对象中是否有足够的开销来证明非泛型ListDictionary的开销是合理的?
将使用这个对象的代码将在每次页面加载时被枚举,我猜这就是为什么ListDictionary类被使用而不是其他替代品的原因,这也是为什么我希望这个数据列表具有最佳性能的原因。

oxf4rvwz

oxf4rvwz1#

不幸的是,没有ListDictionary的通用等价物。
但是实现一个应该不是很困难。ListDictionary的工作原理是保存一个键/值对的链表,并在查找操作中迭代它们。你可以通过用一些非常简单的LINQ表达式 Package LinkedList<T>来构建ListDictionary<TKey,TValue>
例如

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;
  }
  ...
}
kq0g1dla

kq0g1dla2#

没有ListDictionary的通用等价物。
如果你使用这个小字典的时候不受AddRemove的支配,你可以考虑SortedList<TKey, TValue>,尽管它的名字叫IDictionary<TKey, TValue>,但它实现了IDictionary<TKey, TValue>,与ListDictionary不同,SortedList由一个排序键数组和一个数组值支持。

2uluyalo

2uluyalo3#

如果你存储在ListDictionary中的数据总是对象(类),而不是值类型,那么它可能比Dictionary快;如果你存储的是值类型(structs,int,double等),那么装箱/拆箱的成本很可能会平衡,我推荐Dictionary。
然而,总的来说,我想指出的是,这两者之间的性能差异可能是总体性能问题中最小的。当涉及到性能优化时,像这样的小事情通常是最不需要担心的。更大规模的事情,如进程间调用、数据库和Web服务交互,在关注ListDictionary和Dictionary之间的微小性能差异之前,应该首先解决这些问题。

8cdiaqws

8cdiaqws4#

MSDN-ListDictionary类进行简单检查即可发现
这是一个使用单向链表的IDictionary的简单实现。如果元素的数量是10或更少,它比Hashtable更小更快。如果性能对大量元素很重要,则不应使用此方法。

ncecgwcz

ncecgwcz5#

我们可以用,

System.Collections.Generic.Dictionary<Object,Object> dictTemp = new System.Collections.Generic.Dictionary<Object,Object>();

例如,考虑以下内容,

using System.Collections.Specialized;

    private ListDictionary  g_Attributes = new ListDictionary();
    public ListDictionary Attributes
    {
        get { return this.g_Attributes; }
    }
    public string GetAttribute(string name)
    {
        if (HasAttribute(name))
            return (string) g_Attributes[name];
        else
            return null;
    }
    public bool HasAttribute(string name)
    {
        return this.Attributes.Contains(name);
    }

    using System.Collection.Generic;

    private Dictionary<string, object> g_Attributes = new Dictionary<string, object>();
    public Dictionary<string, object> Attributes
    {
        get { return this.g_Attributes; }
    }
    public string GetAttribute(string name)
    {
        if (HasAttribute(name))
        {
            return g_Attributes[name].ToString();
        }
        else
        {
            return null;
        }
    }
    public bool HasAttribute(string name)
    {
    return this.Attributes.ContainsKey(name);
    }

我想这个会帮你一点忙!

相关问题