我有一个简单的自定义对象:
class CertQuestion
{
public string Field {get;set;}
public string Value {get;set;}
}
随后我发现自己在某些代码中使用了List。我正在试图弄清楚如何将CertQuestions列表格式化为相应的字典,并将类似的字段名称组合在一起。例如,给出以下列表:
List<CertQuestion> certQuestions = new List<CertQuestion>()
{
new CertQuestion("Key", "Value1"),
new CertQuestion("Key", "Value2"),
new CertQuestion("Key2", "Value"),
new CertQuestion("Key2", "Value2")
};
我想将它(尝试使用LINQ)转换为带有两个条目的字典,例如
{{"Key", "Value1, Value2"}, {"Key2", "Value, Value2"}}
答案 0 :(得分:7)
按字段对问题进行分组,然后通过选择键,然后选择值转换为字典。价值成为分组列表。
certQuestions.GroupBy(c => c.Field)
.ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToList())
或者对于数组:
certQuestions.GroupBy(c => c.Field)
.ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToArray())
根据评论中的问题进行修改:
class CertTest
{
public string TestId {get;set;}
public List<CertQuestion> Questions {get;set;}
}
var certTests = new List<CertTest>();
您将使用SelectMany扩展方法。它旨在聚合原始列表的每个元素中的属性列表对象:
certTests.SelectMany(t => t.Questions)
.GroupBy(c => c.Field)
.ToDictionary(k => k.Key, v => v.Select(f => f.Value).ToList())
答案 1 :(得分:3)
您的要求是以逗号分隔的值列表,可以这样做:
var dict = certQuestions.GroupBy(c => c.Field)
.ToDictionary(k => k.Key, v => String.Join(", ", v.Select(x => x.Value)))
实例:http://rextester.com/LXS58744
(您应该考虑实际想要的是Array
或List<string>
的值 - 请参阅其他答案)