77

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

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

どちらか一方を使用する必要がある理由についての考えや提案はありますか?

4

7 に答える 7

92

Dictionary<string, string>より現代的なアプローチです。実装されIEnumerable<T>ており、LINQyのものにより適しています。

StringDictionary昔ながらのやり方です。それはジェネリックスの時代の前にありました。レガシーコードとインターフェイスする場合にのみ使用します。

于 2009-03-09T19:49:05.143 に答える
43

もう一つのポイント。

これはnullを返します:

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

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

Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
于 2011-01-12T14:33:48.117 に答える
40

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 は、モダンとオールドスクールの違いよりも重要です。

于 2011-07-22T17:28:07.720 に答える
39

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

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

見る:

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

于 2009-03-09T19:50:34.857 に答える
3

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
于 2011-11-10T14:44:28.200 に答える
1

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

于 2011-02-15T23:15:29.267 に答える
1

もう 1 つの関連する点は、(ここで間違っている場合は訂正してください)System.Collections.Generic.Dictionaryはアプリケーション設定 ( ) では使用できないのProperties.Settingsに対し、System.Collections.Specialized.StringDictionary.

于 2012-11-12T05:28:57.433 に答える