添加到C#字典:无法转换为'字符串' to' System.Collections.Specialized.NameValueCollection'

时间:2017-04-26 08:38:35

标签: c#

我有一个数据来源,其中包含3个不同的值,如下所示,

List<Configuration> lst = new List<Configuration>
        {
            new Configuration{Name="A", Config="X", Value="1"},
            new Configuration{Name="A", Config="X", Value="2"},
            new Configuration{Name="B", Config="Y", Value="2"}
        };

 public class Configuration
{
    public string Name { get; set; }
    public string Config { get; set; }
    public string Value { get; set; }
}

在这里,我想迭代到整个源代码,并希望保持&#34; Name&#34;值作为KEY和&#34; Config&#34; &安培; &#34;值&#34;进入&#34; NameValueCollection&#34;。

为此,我正在拿一本如下的字典,

var config = new Dictionary<string, NameValueCollection>();

但是在添加到这本词典时,我遇到了2个问题,

foreach(var c in lst)
        {
            config.Add(c.Name, new NameValueCollection { c.Config, c.Value });
        }
  1. 重复键(名称=&#34; A&#34;)
  2. 这一行给出错误,新的NameValueCollection {c.Config,c.Value});
  3. 注意 - 我希望X和1都是1(如果是重复键)

    是否有更好的C#集合或如何解决上述错误。

    谢谢!

4 个答案:

答案 0 :(得分:6)

您可以使用lookups的字典(它表示将键映射到多个值的集合):

var config = lst.GroupBy(cfg => cfg.Name)
                .ToDictionary(g => g.Key, 
                              g => g.ToLookup(cfg => cfg.Config, cfg => cfg.Value));

配置类型为

Dictionary<string, ILookup<string, string>>

访问值:

config["A"]["X"] // gives you IEnumerable<string> with values ["1","2"]

答案 1 :(得分:3)

试试这个:

        List<Configuration> lst = new List<Configuration>
        {
            new Configuration{Name="A", Config="X", Value="1"},
            new Configuration{Name="A", Config="X", Value="2"},
            new Configuration{Name="B", Config="Y", Value="2"}
        };
        var config = new Dictionary<string, NameValueCollection>();
        NameValueCollection temp = new NameValueCollection();
        foreach (var c in lst)
        {
            if(config.TryGetValue(c.Name, out temp)){
                config[c.Name].Add(c.Config,c.Value);
            }
            else{
                config.Add(c.Name, new NameValueCollection { {c.Config,c.Value } });
            }
        }

答案 2 :(得分:2)

NameValueCollection包含多个名称和值,因为它是一个集合。因此,你不能以自己的方式对其进行初始化。但是您可以使用它将所有重复的Name分组到同一个集合中。我使用Dictionary<k,v>.TryGetValue

var config = new Dictionary<string, NameValueCollection>();

foreach (Configuration c in lst)
{
    NameValueCollection nvc;
    if(!config.TryGetValue(c.Name, out nvc))
    {
        nvc = new NameValueCollection();
        config.Add(c.Name, nvc);
    }
    nvc.Add(c.Config, c.Value);
}

答案 3 :(得分:0)

试试这个: 在Dictionary类中无需检查值是否重复; 如果它的第一次将被添加。 如果是第二次更新。

   List<Configuration> lst = new List<Configuration>
    {
        new Configuration{Name="A", Config="X", Value="1"},
        new Configuration{Name="A", Config="X", Value="2"},
        new Configuration{Name="B", Config="Y", Value="2"}
    };
        var config = new Dictionary<string, NameValueCollection>();
        foreach (var c in lst)
        {
            config[c.Name] = new NameValueCollection { { c.Config, c.Value } };

        }