添加到C#字典:无法从'string'转换为'System.Collections.Specialized.NameValueCollection'

use*_*018 7 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; }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我想迭代到整个源,并希望将"Name"值保持为KEY,将"Config"和"Value"保存为"NameValueCollection".

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

var config = new Dictionary<string, NameValueCollection>();
Run Code Online (Sandbox Code Playgroud)

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

foreach(var c in lst)
        {
            config.Add(c.Name, new NameValueCollection { c.Config, c.Value });
        }
Run Code Online (Sandbox Code Playgroud)
  1. 重复键(名称="A")
  2. 这一行给出错误,新的NameValueCollection {c.Config,c.Value});

注意 - 我希望X和1都是1(如果是重复键)

有没有更好的C#集合或如何解决上述错误.

谢谢!

Ser*_*kiy 6

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

var config = lst.GroupBy(cfg => cfg.Name)
                .ToDictionary(g => g.Key, 
                              g => g.ToLookup(cfg => cfg.Config, cfg => cfg.Value));
Run Code Online (Sandbox Code Playgroud)

配置类型将是

Dictionary<string, ILookup<string, string>>
Run Code Online (Sandbox Code Playgroud)

访问值:

config["A"]["X"] // gives you IEnumerable<string> with values ["1","2"]
Run Code Online (Sandbox Code Playgroud)


Yas*_*asi 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 } });
            }
        }
Run Code Online (Sandbox Code Playgroud)