5

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

typeA : 1

typeB : 2

typeA : 11

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

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

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

[编辑 1]

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

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

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

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

4

6 回答 6

2

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

于 2013-05-17T12:49:11.303 回答
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, values

于 2013-05-17T12:51:38.280 回答
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]);
于 2013-05-17T12:44:42.197 回答
0

make your own method, it works for me --

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

then call it on list as --

list.Remove(key,value); //Pass the key value...
于 2013-05-17T12:47:08.743 回答
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());
于 2013-05-17T12:50:12.700 回答
-1

您可以改用 Dictionary 集合:

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

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

请参阅本教程以获得更多帮助。

于 2013-05-17T12:43:09.907 回答