从NameValueCollection中删除单个值

时间:2013-05-17 12:37:13

标签: c# namevaluecollection

我的数据源可能包含带有值的重复键。

typeA : 1

typeB : 2

typeA : 11

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

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

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

    首先,感谢所有答案:)

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

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

    现在,我的问题是,对于大尺寸数据,考虑到性能,使用XDocument是一个不错的选择吗? 如果没有其他替代方案(可能回到NameValueCollection并使用提到的技术之一来删除数据)

6 个答案:

答案 0 :(得分:2)

使用相同的密钥存储多个值的想法有点奇怪。但我认为你可以使用GetValues检索所有值,然后删除你不需要的值,然后使用Set然后后续的Add方法将它们放回去。您可以为此创建单独的扩展方法方法。

答案 1 :(得分:1)

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,值

答案 2 :(得分:0)

您可以将其转换为Hashtable

           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]);

答案 3 :(得分:0)

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

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...

答案 4 :(得分:0)

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

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());

答案 5 :(得分:-1)

您可以改为使用Dictionary集合:

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

当您尝试插入type: 11时,它将抛出异常,因为Key已存在。因此,您可以输入一个新密钥来插入此数据。

请参阅此Tutorial以获取进一步的帮助。