System.Collections.Specialized.NameObjectCollectionBase有两个相似的特性:NameValueCollection上的属性Keys和AllKeys之间的区别是什么?
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
难道他们提供不同的数据集?我什么时候想要使用一个?
System.Collections.Specialized.NameObjectCollectionBase有两个相似的特性:NameValueCollection上的属性Keys和AllKeys之间的区别是什么?
string[] AllKeys
NameObjectCollectionBase.KeyCollection Keys
难道他们提供不同的数据集?我什么时候想要使用一个?
AllKeys
是O(n)
操作,而Keys
是O(1)
。这是因为AllKeys
将密钥复制到新阵列中,而Keys
只是返回对NameValueCollection
的私钥集合的引用。因此,除了性能差异之外,由Keys
返回的集合将随基本集合而改变,因为它仅仅是对原始参考的参考,而AllKeys
将与变更隔离,因为它是副本。
这个小测试程序显示在行为差异:
using System;
using System.Collections.Specialized;
static class Program
{
static void Main()
{
var collection = new NameValueCollection();
var keys = collection.Keys;
var allKeys = collection.AllKeys;
collection.Add("Name", "Value");
Console.WriteLine("Keys: " + keys.Count);
Console.WriteLine("AllKeys: " + allKeys.Length);
Console.ReadLine();
}
}
输出是:
Keys: 1
AllKeys: 0
然而,还有额外的好处,你可以使用foreach或LINQ语句对AllKeys()的返回进行操作。由于它是一个副本,因此您将不会在修改当前列举的列表时遇到错误。
这就是我的想法。你一定会认为这样的重大差异将在文档中明确。 (或者可能命名更好,以反映语义)。通常,MSDN文档对于类似的东西非常优秀。这就是为什么这一个让我无法防备的原因。 – MojoFilter 2009-04-29 18:00:32