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

  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

其他提示

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

密钥

  

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

AllKeys

  

此方法是O(n)操作,其中n是Count。

基本上,似乎Keys的性能更好。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top