将List转换为Dictionary <string,string [] =“”> </string,>

时间:2015-03-10 17:25:10

标签: c# .net

我有一个简单的自定义对象:

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"}}

2 个答案:

答案 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

(您应该考虑实际想要的是ArrayList<string>的值 - 请参阅其他答案)