我的数据源可能包含带有值的重复键。
typeA : 1
typeB : 2
typeA : 11
我选择使用NameValueCollection
,因为它可以输入重复的密钥。
我想从集合中删除特定的键\值对,但NameValueCollection.Remove(key)
会删除与指定键关联的所有值。
NameValueCollection
删除单个键\值对,
OR [编辑1]
首先,感谢所有答案:)
我想我应该提到我的数据源是XML。
我使用System.Xml.Linq.XDocument
来查询类型,并且删除特定值也很方便。
现在,我的问题是,对于大尺寸数据,考虑到性能,使用XDocument是一个不错的选择吗? 如果没有其他替代方案(可能回到NameValueCollection并使用提到的技术之一来删除数据)
答案 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以获取进一步的帮助。