【问题标题】:KeyValuePair vs. NameValueCollectionKeyValuePair 与 NameValueCollection
【发布时间】:2011-05-27 01:29:59
【问题描述】:

还有KeyValuePair vs IDictionary之类的其他问题,但我感觉这个有点不同。

NameValueCollection 接受字符串键和字符串值。

KeyValuePair 就像一个字典,你告诉它键和值是什么类型。

我不明白为什么NameValueCollection 存在。用字符串类型初始化 KeyValuePair 似乎就足够了。我还注意到NameValueCollection 有更多可用的方法,但为什么不将两个类合并为一个呢?

【问题讨论】:

  • KeyValuePair 不像字典。它只是一个包含键和值的元组。
  • @pst,字典采用键/值对列表。我看不出有什么不同。
  • @Nick var kvp = new KeyValuePair&lt;string,string&gt;("Hello", "World!") -- KeyValuePair<K,V>
  • @Nick:字典只能有一个键。
  • 我相信我的误解是字典包含键值对,而键值对是单数的,例如,您不能继续添加到 pst 的 kvp 示例中。

标签: c# .net collections


【解决方案1】:

KeyValuePair 不像字典。它只是一个包含键和值的元组。

NameValueCollectionIList&lt;KeyValuePair&lt;string,IList&lt;string&gt;&gt;&gt; 的包装器(注意 NameValueCollection 早于泛型) - 像 Get(string) 这样的操作是 O(n) 并且项目可以通过索引和每个键映射到一个或多个值(这不同于Dictionary&lt;string,string&gt;)。

the NameValueCollection documentation 中解释了其原因:

该类可用于标题、查询字符串和表单数据。

NameValueCollection 具有 一些 类似行为的较新 "replacement" 数据结构是 Lookup&lt;string,string&gt;。 (但是,它不直接支持与花费者笔记不可变的相同操作。)

编码愉快。

【讨论】:

  • 在这种情况下 Lookup 的主要问题是它是不可变的,不像 NaveValueCollection 可以添加。因此,它并不是真正的“替代品”,而是具有类似的行为。
【解决方案2】:

NameValueCollection 存在于 .NET 1.0 和 1.1 中,KeyValuePair 是泛型类型,直到 2.0 才添加到 .NET。 System.Collections.Specialized 中的所有类都早于泛型的添加;它包含某些强类型(如果您愿意,可以专门),以便在您需要用户不必从对象转换为字符串时使用。

【讨论】:

    【解决方案3】:

    KeyValuePair 是用于迭代Dictionary 的组件

    var dictionary = new Dictionary<int,long>
    
    foreach(var kvp in dictionary)
    {
        // kvp is KeyValuePair<int,long>. kvp.Key is the int key and kvp.Value is the long value for the key
    }
    

    NameValueCollection 是可索引的。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 2013-10-16
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多