NameValueCollection上的Keys和AllKeys属性有什么区别?

Moj*_*ter 44 .net collections

System.Collections.Specialized.NameObjectCollectionBase有两个类似的属性:

  string[] AllKeys
  NameObjectCollectionBase.KeyCollection Keys
Run Code Online (Sandbox Code Playgroud)

他们提供不同的数据集吗?我什么时候想要使用另一个?

Nei*_*ams 61

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Keys: 1
AllKeys: 0
Run Code Online (Sandbox Code Playgroud)

  • 这也是我的想法.您肯定认为这样的重大差异在文档中是明确的.(或者可能更好地命名以反映语义).通常,MSDN文档非常适合这样的事情.这就是为什么这个让我措手不及的原因. (5认同)

BFr*_*ree 6

根据MSDN的文档,当使用AllKeys时,它是O(n)来检索所有值,而当使用Keys时它是O(1).

按键

检索此属性的值是O(1)操作

AllKeys

该方法是O(n)操作,其中n是Count.

所以基本上,似乎Keys具有更好的性能.


Kry*_*pes 5

但是,在AllKeys()返回时,使用foreach或LINQ语句可以对集合进行操作,这是一个额外的好处.由于它是一个副本,因此修改当前正在枚举的列表时不会出错.