从NameValueCollection中删除单个值

5

我的数据源可能存在具有相同值的重复键。

typeA : 1

typeB : 2

typeA : 11

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

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

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

[编辑1]

首先,感谢所有的答案:)

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

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

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


不,我认为使用元素的索引可能行不通,你可能需要尝试其他方法。 - Nipun Ambastha
2
尝试使用 List<Tuple<T1,T2>> - Ahmed KRAIEM
实际上没有办法可以做到这一点。如果你确实必须这样做,那么只需遍历整个内容,创建一个全新的NameValueCollection。NameValueCollection非常强大,但与所有特定的集合一样,它是为了执行特定的任务而构建的,并且有些事情无法用它完成。 - Fattie
6个回答

2

使用同一个键存储多个值的想法有些奇怪。但是我认为你可以使用GetValues检索所有值,然后使用Set和随后的Add方法删除不需要的值并将它们重新放回。你可以为此创建一个单独的扩展方法。


1
NameValueCollection实际上不允许具有相同键的多个条目。它只是将现有键的新值连接成一个由逗号分隔的值列表(请参见NameValueCollection.Add)。
因此,每个键实际上只有一个值。您可以想象一下获取该值并将其拆分为“,”,然后删除有问题的值。 编辑:@ElDog是正确的,有一个GetValues方法可以为您执行此操作,因此无需拆分。 我认为更好的选择是使用Dictionary<string, IList<int>>Dictionary<string, ISet<int>>将值存储为离散的值。

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

1
字典将包含值["a", "1,1"]和["b", "2"]。这可能不是Ayman想要的。 - user707727

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

只有当 EqualityComparer<TKey>.DefaultEqualityComparer<TValue>.Default 产生正确的结果时,此解决方案才有效。 - Ahmed KRAIEM

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

如果列表中没有一个元素,Single() 会抛出异常。以下代码是正确的:var val = typeList.Where (t => t.Name == "TypeA" && t.Value == 1).SingleOrDefault(); if (val != null) typeList.Remove (val); - Ahmed KRAIEM
是的抱歉,应该提一下 - 我只是很快地拼凑了一下代码......然而,在此处抛出(捕获)异常可能会很方便,以指示已尝试删除无效数据。我的看法是这样的。 - Andrew
是的,这取决于用户是否认为“尝试删除无效数据”是“异常”的。 - Ahmed KRAIEM

-1
你可以使用字典集合代替:
Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("typeA", 1);
dictionary.Add("typeB", 1);

当您尝试插入type: 11时,它将抛出异常,因为键已经存在。因此,您可以输入一个新的键来插入这个数据。
请参考Tutorial以获取进一步帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接