System.Collections.Specialized.StringDictionary オブジェクトと System.Collections.Generic.Dictionary の間の実際的な違いを知っている人はいますか?
私は過去に両方を使用してきましたが、どちらがより優れたパフォーマンスを発揮するか、Linq でより適切に機能するか、またはその他の利点を提供するかについてはあまり考えていませんでした。
どちらか一方を使用する必要がある理由についての考えや提案はありますか?
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"];
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はほとんど時代遅れだと思います。フレームワークのv1.1(ジェネリック以前)に存在していたため、当時は(非ジェネリック辞書と比較して)優れたバージョンでしたが、現時点では、特定の利点はないと思います。辞書上。
ただし、StringDictionaryには欠点があります。StringDictionaryはキー値を自動的に小文字にし、これを制御するためのオプションはありません。
見る:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/
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
より「現代的な」クラスであることに加えて、Dictionary は StringDictionary よりも大幅にメモリ効率が高いことに気付きました。
もう 1 つの関連する点は、(ここで間違っている場合は訂正してください)System.Collections.Generic.Dictionary
はアプリケーション設定 ( ) では使用できないのProperties.Settings
に対し、System.Collections.Specialized.StringDictionary
.