我想将我的自定义集合存储为Key,Value也是字符串List的集合。我可以同时使用KeyvaluePair和hashtable来实现这一点。什么是最合适的集合,它在灵活性方面给我带来了更多优势?

最佳答案

Hashtable是随机访问,在.NET 1.1中内部将System.Collections.DictionaryEntry用于其项目;而.NET 2.0中的强类型System.Collections.Generic.Dictionary使用System.Collections.Generic.KeyValuePair项目,并且也是随机访问的。

(注意:提供示例时,此答案偏向.NET 2.0框架-这就是为什么它继续使用KeyValuePair而不是DictionaryEntry的原因-原始问题表明这是需要使用的Type。)

因为 KeyValuePair 是一个独立的类,所以您可以手动创建KeyValuePair实例的列表或数组,但是将顺序访问列表或数组。这与在内部创建自己的元素实例并被随机访问的Hashtable或Dictionary相反。两者都是使用KeyValuePair实例的有效方法。另请参见see MSDN info about selecting a Collection class to use

总结:使用少量项目集时顺序访问最快,而较大的项目集则受益于随机访问。

微软的混合解决方案:
NETt 1.1中引入的一个有趣的专业集合是System.Collections.Specialized.HybridDictionary,它在集合较小时使用ListDictionary内部表示(顺序访问),然后在集合变大时自动切换到Hashtable内部表示(随机访问)。

C#示例代码

以下示例显示了为不同场景创建的相同键-值对实例-顺序访问(两个示例),然后是一个随机访问示例。为了简单起见,在这些示例中,它们都将使用带字符串值的int key -您可以替换需要使用的数据类型。

这是键值对的强类型System.Collections.Generic.List。
(顺序访问)

// --- Make a list of 3 Key-Value pairs (sequentially accessed) ---
// build it...
List<KeyValuePair<int, string>> listKVP = new List<KeyValuePair<int, string>>();
listKVP.Add(new KeyValuePair<int, string>(1, "one"));
listKVP.Add(new KeyValuePair<int, string>(2, "two"));
// access first element - by position...
Console.Write( "key:" + listKVP[0].Key + "value:" + listKVP[0].Value );

这是键值对的System.Array。
(顺序访问)
// --- Make an array of 3 Key-Value pairs (sequentially accessed) ---
// build it...
KeyValuePair<int, string>[] arrKVP = new KeyValuePair<int, string>[3];
arrKVP[0] = new KeyValuePair<int, string>(1, "one");
arrKVP[1] = new KeyValuePair<int, string>(2, "two");
// access first element - by position...
Console.Write("key:" + arrKVP[0].Key + "value:" + arrKVP[0].Value);

这是键值对字典。
(随机访问)
// --- Make a Dictionary (strongly typed) of 3 Key-Value pairs (randomly accessed) ---
// build it ...
Dictionary<int, string> dict = new Dictionary<int, string>();
dict[1] = "one";
dict[2] = "two";
// access first element - by key...
Console.Write("key:1 value:" + dict[1]); // returns a string for key 1

关于c# - .NET中的KeyValuePair和Hashtable有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1781204/

10-10 06:16