System.Collections.Specialized.StringDictionaryオブジェクトとSystem.Collections.Generic.Dictionaryの実際的な違いは何か知っていますか?
私は過去に両方を使用したことがありますが、どちらがパフォーマンスが良く、Linqでよりよく機能するか、または他の利点を提供するかについてはあまり考えていません。
なぜどちらを使うべきかについての考えや提案はありますか?
Dictionary<string, string>
はより近代的なアプローチです。 IEnumerable<T>
そしてそれはLINQyのものにより適しています。
StringDictionary
は古いやり方です。ジェネリック時代の前にありました。私は、レガシーコードとインターフェイスするときにのみ使用します。
別のポイント。
これはnullを返します。
StringDictionary dic = new StringDictionary();
return dic["Hey"];
これは例外をスローします:
Dictionary<string, string> dic = new Dictionary<string, string>();
return dic["Hey"];
StringDictionaryはかなり時代遅れだと思います。フレームワークのv1.1(ジェネリックの前)に存在していたため、当時は(非ジェネリックディクショナリと比較して)優れたバージョンでしたが、現時点では、特定の利点はないと思います辞書以上。
ただし、StringDictionaryには欠点があります。 StringDictionaryはキーの値を自動的に小文字にします。これを制御するオプションはありません。
見る:
http://social.msdn.Microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/
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は、現代と旧式の違いよりも重要です。
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
別の関連するポイントは、それです(ここで間違っている場合は修正してください)System.Collections.Generic.Dictionary
は、アプリケーション設定(Properties.Settings
)に対してSystem.Collections.Specialized.StringDictionary
です。
より「モダンな」クラスであることに加えて、DictionaryはStringDictionaryよりもはるかにメモリ効率が高いことに気付きました。