【问题标题】:What is the difference between the properties Keys and AllKeys on a NameValueCollection?NameValueCollection 上的属性 Keys 和 AllKeys 有什么区别?
【发布时间】:2010-10-22 15:42:56
【问题描述】:

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

  string[] AllKeys
  NameObjectCollectionBase.KeyCollection Keys

它们是否提供不同的数据集?我什么时候想使用其中一个?

【问题讨论】:

    标签: .net collections


    【解决方案1】:

    AllKeysO(n) 操作,而 KeysO(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 文档对这类事情非常出色。这就是为什么这个让我措手不及的原因。
    • 同意,名字不好,语义不清楚。更不用说 FxCop 出于这个原因不喜欢返回数组的属性!由于这个类是泛型时代的遗留物,也许 Dictionary 或 Dictionary 现在会更好?
    • 我总是在 MSDN 中看到这种缺乏文档的情况。
    • 全班都傻。如果您在其上调用 ToString,它会使用错误的 URL 编码并输出具有 %uXXXX 编码的值,这在 URL 查询字符串中无效(必须 UTF8 字节编码为 %XX)。您可以在 app.config 或 web.config 中添加一个全局应用设置来停止 %uXXXX 编码:“aspnet:DontUsePercentUUrlEncoding”。
    • 相反,您需要将值复制到字典(访问时值未编码),然后从字典中构造一个新的 FormUrlEncodedContent 实例,例如:new FormUrlEncodedContent(keyValueDict)。然后在对象上调用ReadAsStringAsync().Result 以获取可以分配给 UriBuilder 的 Query 属性的有效查询字符串。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      Keys

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

      AllKeys

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

      所以基本上看来,Keys 的性能更好。

      【讨论】:

        猜你喜欢
        • 2020-03-07
        • 2011-11-14
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多