2009-03-09 31 views
64

System.Collections.Specialized.StringDictionaryオブジェクトとSystem.Collections.Generic.Dictionaryの間に実際的な違いがあることを知っている人はいませんか?StringDictionaryと辞書<文字列、文字列>

私はこれまで、どちらの方が優れているか、Linqとうまくいっているか、他のメリットを提供することはあまり考えられていませんでした。

なぜ私は1つをもう一方の上で使用すべきかに関する考えや提案はありますか?

答えて

77

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

StringDictionaryは古い学校です。それはジェネリックの日の前にあった。私は、レガシーコードとのインタフェースのときにのみ使用します。

+2

2つのパフォーマンスに違いはありますか? – thecoop

+0

あなたの特別な状況の方が優れているかどうかを判断するには、ベンチマークを行う必要があります。パフォーマンスの違いが目立つとは思っていません。すべての新しいコードに 'Dictionary 'を使うことをお勧めします(1.1をターゲットにする必要がない限り)。 –

+1

@thecoop私の側から提示するハードデータはありませんでしたが、スピードをテストしたときに 'StringDictionary'が悪化しました(ほとんどすべて問題ありませんでした)。実際、正直言って、以前は、 'StringDictionary'は、' string'がキーであったときの高速化のための特別なコレクションであり、私のテストで悪化したときの私の大きな驚きには、それはノンネリックであることを学ぶために – nawfal

33

私はStringDictionaryはかなり古くなっていると思います。それはフレームワークのv1.1(ジェネリックの前)に存在していたので、当時は優れたバージョンでした(非ジェネリック辞書と比較して)が、この時点ではそれに特有の利点はないと私は信じています辞書に

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

参照:

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

+0

'Dictionary 'はできませんが、 'StringDictionary'は' Properites.Settings'で使用できます。だから時代遅れかどうか、 'StringDictionary'のためにまだいくつかの使用があります。 – jahu

36

もう一つのポイント。

これはnullを返します。

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

これは例外スロー:もっと「現代」クラスであることに加え

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

''例外をスローする '*機能 ''辞書 '>'は ''] 'を使うことはできません。 Use StringDictionaryは私のコードの多くを整理しました。 –

+0

@James私はもう少し遅いですが、おそらくTryGetValueを使うべきです。 –

+0

@ŞafakGür - 私はtryGetValue()を使用します - 例外をスローするため、 '[]'を使うことはできないためです。 (StringDictionaryはこれを1つのタイプのディクショナリでのみ解決します) –

1

を、私は辞書が大きなマージンによってStringDictionaryより多くのメモリ効率的であることに気づきました。

+8

ここでいくつかの数字を使うことができます – Zonko

29

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は、現代の対古い学校の違いよりも重要である。この巨大違い、にもっと注意を引くために、この返信を追加しています。

+2

何らかの理由でDictionary で同じ動作が必要な場合は、これを使用できます: 辞書 ht = new Dictionary (StringComparer.OrdinalIgnoreCase ); ht.Add( "Bob"、 "ff"); ht.Add( "bob"、 "ff"); //例外をスローする – osexpert

2

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 
1

別の関連するpoi ntはそれです(私がここで間違っていれば私を修正してください)System.Collections.Specialized.StringDictionaryですが、はアプリケーション設定(Properties.Settings)で使用できません。

関連する問題