改善从List到List的转换<dictionary <string,string>&gt;与Linq </dictionary <string,string>

时间:2014-12-03 18:17:53

标签: c# performance linq

我的数据库中有一个键/值表,我会返回一个字典列表。 以下代码对我来说很好,但是有很多数据没有执行。

注意:r.name不包含唯一值

List<Dictionary<string, string>> listOutput = null;

using (ExampleDB db = new ExampleDB())
{
    var result = (from r in db.FormField
               where r.Form_id == 1
               select new { r.ResponseId, r.name, r.value}).toList();

    listOutput = new List<Dictionary<string, string>>();

    foreach (var element in result)
    {
        listOutput.Add((from x in listOutput
               where x.ResponseId == element.ResponseId
               select x).ToDictionary(x => x.name, x => x.value));
    }
}

return listOutput;

您对如何改进此代码有什么建议吗?

2 个答案:

答案 0 :(得分:4)

怀疑你想要的东西是:

List<Dictionary<string, string>> result;

using (var db = new ExampleDB())
{
    result = db.FormField
               .Where(r => r.Form_id == 1)
               .GroupBy(r => r.ResponseId, r => new { r.name, r.value })
               .AsEnumerable()
               .Select(g => g.ToDictionary(p => p.name, p => p.value))
               .ToList();
}

换句话说,我们会对r.Form_id == 1进行过滤,然后按ResponseId进行分组...获取与每个ID关联的所有名称/值对,并根据这些名称创建字典/值对。

请注意,您正在丢失词典列表中的ResponseId - 您无法告诉哪个词典对应哪个回复ID。

AsEnumerable部分是为了确保使用LINQ to Objects执行最后一个Select,而不是尝试将其转换为SQL。 可能它可以在没有AsEnumerable的情况下工作,但它至少取决于您的提供商。

答案 1 :(得分:0)

根据我收集的内容,您尝试根据每个ResponseId创建一个键/值对列表。试试GroupBy

var output = result.GroupBy(r => r.ResponseId)
                   .Select(r => r.ToDictionary(s => s.Name, s => s.Value));

这将返回IEnumerable<Dictionary<string,string>>,如果您确实需要列表,则可以ToList