Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从NameValueCollection中删除单个值_C#_Namevaluecollection - Fatal编程技术网

C# 从NameValueCollection中删除单个值

C# 从NameValueCollection中删除单个值,c#,namevaluecollection,C#,Namevaluecollection,我的数据源可能具有具有值的重复键 typeA : 1 typeB : 2 typeA : 11 我选择使用NameValueCollection,因为它允许输入重复的键 我想从集合中删除特定的键\值对,但NameValueCollection.remove(key)删除与指定键关联的所有值 有没有办法从NameValueCollection中删除单个键值对, 或 是否有更适合我的数据的C#集合 [编辑1] 首先,感谢所有的答案:) 我想我应该提到我的数据源是XML 我使用System.Xm

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

typeA : 1

typeB : 2

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

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

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

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

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

    我使用
    System.Xml.Linq.XDocument
    来查询类型,还可以方便地删除特定值

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

    您可以使用Dictionary集合:

    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    dictionary.Add("typeA", 1);
    dictionary.Add("typeB", 1);
    
    Dictionary Dictionary=newdictionary();
    词典.加上(“A型”,1);
    字典。加上(“B型”,1);
    
    当您尝试插入
    type:11
    时,它将抛出异常,因为密钥已经存在。因此,您可以输入一个新密钥来插入此数据


    有关更多帮助,请参阅此文档。

    您可以将其转换为哈希表

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

    做你自己的方法,对我有用--


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

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

    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());
    
    公共类单一类型
    {
    公共字符串名称;
    公共价值观;
    }
    列表类型列表=新列表();
    添加(新的SingleType{Name=“TypeA”,Value=1});
    添加(新的SingleType{Name=“TypeA”,Value=3});
    typeList.Remove(typeList.Where(t=>t.Name==“TypeA”&&t.Value==1.Single());
    
    NameValueCollection
    实际上不允许有多个具有相同密钥的条目。它只是将现有键的新值连接到以逗号分隔的值列表中(请参阅)

    因此,每个键实际上只有一个值。可以想象,您可以在“,”上拆分它们,并删除有问题的值

    
    编辑:@ElDog是正确的,有一个GetValues方法可以为您执行此操作,因此无需拆分。
    


    我认为更好的选择是使用
    Dictionary
    Dictionary
    将值存储为离散的erm,value

    不,我认为它不适用于元素的索引,可能您需要尝试其他方法try
    List
    确实没有办法。如果必须这样做,只需在整件事,打造一个全新的NameValueCollection。NameValueCollection功能强大得惊人,但与所有特定的集合一样,它是为完成特定的任务而构建的,有些事情根本无法用它来完成。字典将包含值[“a”、“1,1”和[“b”、“2”]。这可能不是Ayman所追求的。
    Single()
    如果列表中没有一个元素,则引发异常。这应该可以:
    var val=typeList.Where(t=>t.Name==“TypeA”&&t.Value==1.SingleOrDefault();if(val!=null)typeList.Remove(val);
    是的,对不起,应该提到这一点-只是很快地将代码拼凑在一起……但是抛出一个(捕获)异常在这里可能很方便,表明有人试图删除IMO中的无效数据。是的,这取决于用户是否考虑“尝试删除无效数据”异常此解决方案仅在
    EqualityComparer.Default
    EqualityComparer.Default
    产生正确结果时有效。
    list.Remove(key,value); //Pass the key value...
    
    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());