C#:各种<string,string =“”>集合</string,>之间的区别

时间:2011-07-27 21:09:06

标签: c# string generics collections dictionary

这是一个我总是经常回来的问题:

对于某些xyz情况(最常见的是绑定到<string, string>),使用的最佳DropDownList集合是什么?

有人为此准备了备忘单吗?各种选项之间的区别的完整列表?

2 个答案:

答案 0 :(得分:5)

如果您绑定到下拉列表,您可能会考虑排序顺序,并且集合的大小(最有可能并且在大多数用例中)足够小以避免性能问题。在这些情况下,List<KeyValuePair<string, string>>是一个非常简单的选择,尽管BindingList可能更适合绑定,尤其是在WPF中。

Tuple<string, string>甚至可以取代KeyValuePair

此外,非通用(非强类型)集合通常会给拳击带来一些最糟糕的性能(除了难以处理之外),如果您担心列表开销,可以指定最大大小在创作上尽量减少这一点。泛型类的另一个优点是它们实现了IEnumerable以便与Linq一起使用,根据我的经验,它往往被更广泛地使用并且更好地为同事所知。一般来说,应该有一种明显的方法可以用语言做某事,.Net社区选择Dictionary<string, string>而不是StringDictionary

您还可以添加扩展方法,使基本列表更方便:

public static class ListKeyValuePairExtensions
{
    public static void Add<S, T>(this List<KeyValuePair<S, T>> list, S key, T value)
    {
        list.Add(new KeyValuePair<S, T>(key, value));
    }
}

编辑:正如Porges所指出的那样,在这个问题所解决的案例中,非通用结构的性能损失不是来自装箱和拆箱,但仍有性能损失,请参阅this article快速查看基准。

答案 1 :(得分:1)

以下是我对此的了解程度:



    StringDictionary strDict = new StringDictionary();
        // + Strong Type
        // - lowercases the key
        // - random order ?
        // - older approach, .Net 1 which predates generics

    Dictionary<string, string> dict = new Dictionary<string, string>();
        // + Strong Type
        // - random order ?

    List<KeyValuePair<string, string>> listKVP = new List<KeyValuePair<string, string>>();
        // + Strong Type
        // + Keeps order as inserted
        // - more complex to instanciate and use

    Hashtable hash = new Hashtable();
        // Automatically sorted by hash code
        // Better for big collections
        // - not strong typed

    ListDictionary listDict = new ListDictionary();
        // + faster than Hashtable for small collections (smaller than 10)
        // - not strong typed

    HybridDictionary hybridDict = new HybridDictionary();
        // Better compromise if unsure of length of collection
        // - not strong typed

    OrderedDictionary orderDict = new OrderedDictionary();
        // + Keeps order as inserted
        // - not strong typed

    SortedDictionary<string, string> sortedDict = new SortedDictionary<string, string>();
        // + Strong Type
        // Automatically sorted by key
        // + faster lookup than the Dictionary [msdn]

    SortedList<string, string> sortedList = new SortedList<string, string>();
        // + Strong Type
        // Automatically sorted by key
        // Almost same as SortedDict, but can access by index []

    KeyValuePair<string, string>[] arrayKVP = new KeyValuePair<string, string>[123];
        // + Strong Type
        // + Keeps order as inserted
        // - Fixed size