我有一个数据来源,其中包含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 });
}
注意 - 我希望X和1都是1(如果是重复键)
是否有更好的C#集合或如何解决上述错误。
谢谢!
答案 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 } };
}