web-dev-qa-db-ja.com

StringDictionary対Dictionary <string、string>

System.Collections.Specialized.StringDictionaryオブジェクトとSystem.Collections.Generic.Dictionaryの実際的な違いは何か知っていますか?

私は過去に両方を使用したことがありますが、どちらがパフォーマンスが良く、Linqでよりよく機能するか、または他の利点を提供するかについてはあまり考えていません。

なぜどちらを使うべきかについての考えや提案はありますか?

74
Scott Ivey

Dictionary<string, string>はより近代的なアプローチです。 IEnumerable<T>そしてそれはLINQyのものにより適しています。

StringDictionaryは古いやり方です。ジェネリック時代の前にありました。私は、レガシーコードとインターフェイスするときにのみ使用します。

88
Mehrdad Afshari

別のポイント。

これはnullを返します。

StringDictionary dic = new StringDictionary();
return dic["Hey"];

これは例外をスローします:

Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
40
joshcomley

StringDictionaryはかなり時代遅れだと思います。フレームワークのv1.1(ジェネリックの前)に存在していたため、当時は(非ジェネリックディクショナリと比較して)優れたバージョンでしたが、現時点では、特定の利点はないと思います辞書以上。

ただし、StringDictionaryには欠点があります。 StringDictionaryはキーの値を自動的に小文字にします。これを制御するオプションはありません。

見る:

http://social.msdn.Microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

36
Reed Copsey

Reed Copseyが指摘したように、StringDictionaryはキー値を小文字にします。私にとって、これはまったく予期せぬことであり、ショーストッパーです。

private void testStringDictionary()
{
    try
    {
        StringDictionary sd = new StringDictionary();
        sd.Add("Bob", "My name is Bob");
        sd.Add("joe", "My name is joe");
        sd.Add("bob", "My name is bob"); // << throws an exception because
                                         //    "bob" is already a key!
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

私はこの返信を追加して、この巨大なの違いにもっと注意を向けています。IMOは、現代と旧式の違いよりも重要です。

35
Jeff Roe

StringDictionaryは.NET 1.1に由来し、IEnumerableを実装します

Dictionary<string, string>は.NET 2.0に由来し、IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerableを実装しています

IgnoreCaseはStringDictionaryのキーにのみ設定されます

Dictionary<string, string>はLINQに適しています

        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        dictionary.Add("ITEM-1", "VALUE-1");
        var item1 = dictionary["item-1"];       // throws KeyNotFoundException
        var itemEmpty = dictionary["item-9"];   // throws KeyNotFoundException

        StringDictionary stringDictionary = new StringDictionary();
        stringDictionary.Add("ITEM-1", "VALUE-1");
        var item1String = stringDictionary["item-1"];     //return "VALUE-1"
        var itemEmptystring = stringDictionary["item-9"]; //return null

        bool isKey = stringDictionary.ContainsValue("VALUE-1"); //return true
        bool isValue = stringDictionary.ContainsValue("value-1"); //return false
2
ArekBee

別の関連するポイントは、それです(ここで間違っている場合は修正してください)System.Collections.Generic.Dictionaryは、アプリケーション設定(Properties.Settings)に対してSystem.Collections.Specialized.StringDictionaryです。

1
Matt Lyons

より「モダンな」クラスであることに加えて、DictionaryはStringDictionaryよりもはるかにメモリ効率が高いことに気付きました。

1
Daniel