【问题标题】:Remove a single value from a NameValueCollection从 NameValueCollection 中删除单个值
【发布时间】:2013-05-17 12:37:12
【问题描述】:

我的数据源可能有重复的键和值。

typeA : 1

typeB : 2

typeA : 11

我选择使用NameValueCollection,因为它可以输入重复的键。

我想从集合中删除特定的键\值对,但NameValueCollection.Remove(key) 删除了与指定键关联的所有值。

  1. 有没有办法从NameValueCollection 中删除单个键\值对, 或
  2. C# 中是否有更适合我的数据的集合

[编辑 1]

首先,感谢所有答案:)

我想我应该提到我的数据源是 XML。

我使用System.Xml.Linq.XDocument 来查询类型,并且删除特定值也很方便。

现在,我的问题是,对于大型数据,考虑到性能,使用 XDocument 是一个不错的选择吗? 如果不是,还有其他选择(可能回到 NameValueCollection 并使用提到的其中一种技术来删除数据)

【问题讨论】:

  • 不,我认为它不适用于元素索引,可能您需要尝试其他方式
  • 试试List<Tuple<T1,T2>>
  • 确实没有办法做到这一点。如果您必须这样做,只需遍历整个内容,创建一个全新的 NameValueCollection。 NameValueCollection 非常强大,但是,就像所有特定的集合一样,它是为完成特定的工作而构建的,有些事情根本无法用它来完成。

标签: c# namevaluecollection


【解决方案1】:

用同一个键存储多个值的想法有点奇怪。但我认为您可以使用 GetValues 检索所有值,然后删除不需要的值,然后使用 Set 将它们放回原处,然后使用后续的 Add 方法。您可以为此制作单独的扩展方法方法。

【讨论】:

    【解决方案2】:

    NameValueCollection 并不允许多个条目具有相同的键。它只是将现有键的新值连接到逗号分隔的值列表中(请参阅NameValueCollection.Add

    所以每个键实际上只有一个值。您可以想象将值拆分为 ',' 并删除有问题的值。

    Edit: @ElDog is correct, there is a GetValues method which does this for you so no need to split.

    我认为更好的选择是使用 Dictionary<string, IList<int>>Dictionary<string, ISet<int>> 将值存储为离散 erm,值

    【讨论】:

      【解决方案3】:

      您可以将其转换为哈希表

                 var x = new NameValueCollection();
                 x.Add("a", "1");
                 x.Add("b", "2");
                 x.Add("a", "1");
                 var y = x.AllKeys.ToDictionary(k => k, k=>x[k]);
      

      【讨论】:

      • 字典将包含值 ["a", "1,1"] 和 ["b", "2"]。这可能不是艾曼所追求的。
      【解决方案4】:

      制作你自己的方法,它对我有用--

      public static void Remove<TKey,TValue>(
        this List<KeyValuePair<TKey,TValue>> list,
        TKey key,
        TValue value) {
        return list.Remove(new KeyValuePair<TKey,TValue>(key,value)); 
      }
      

      然后在列表中将其称为 --

      list.Remove(key,value); //Pass the key value...
      

      【讨论】:

      • 此解决方案仅在 EqualityComparer&lt;TKey&gt;.DefaultEqualityComparer&lt;TValue&gt;.Default 产生正确结果时才有效。
      【解决方案5】:

      也许不是最好的方法,但是....

      public class SingleType
      {
          public string Name;
          public int Value;
      }
      
      List<SingleType> typeList = new List<SingleType>();
      typeList.Add (new SingleType { Name = "TypeA", Value = 1 });
      typeList.Add (new SingleType { Name = "TypeA", Value = 3 });
      
      typeList.Remove (typeList.Where (t => t.Name == "TypeA" && t.Value == 1).Single());
      

      【讨论】:

      • 如果列表中没有一个元素,Single() 会引发异常。这应该没问题:var val = typeList.Where (t =&gt; t.Name == "TypeA" &amp;&amp; t.Value == 1).SingleOrDefault(); if (val != null) typeList.Remove (val);
      • 是的,对不起,应该提到 - 只是很快将代码拼凑在一起......但是在这里抛出(捕获的)异常可能很方便,表明有人试图删除无效数据 IMO .
      • 是的,这取决于用户是否认为“试图删除无效数据”异常
      【解决方案6】:

      您可以改用 Dictionary 集合:

      Dictionary<string, int> dictionary = new Dictionary<string, int>();
      dictionary.Add("typeA", 1);
      dictionary.Add("typeB", 1);
      

      当您尝试插入 type: 11 时,它会抛出异常,因为 Key 已经存在。所以你可以输入一个新的键来插入这个数据。

      请参阅此Tutorial 以获得更多帮助。

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多