C# 如何将2层深的foreach循环转换为LINQ表达式以生成Dictionary?

C# 如何将2层深的foreach循环转换为LINQ表达式以生成Dictionary?,c#,linq,c#-4.0,C#,Linq,C# 4.0,如何转换此函数: void MyFunc () { foreach (var k in problems.Keys) { var list = new ObservableCollection<ListViewItem>(); listViewItems.Add(k, list); foreach (var i in problems[k].Items) { list.Add(ne

如何转换此函数:

void MyFunc () {
    foreach (var k in problems.Keys)
    {
        var list = new ObservableCollection<ListViewItem>();
        listViewItems.Add(k, list);
        foreach (var i in problems[k].Items)
        {
            list.Add(new ListViewItem
            {
                Token = i.Token,
                IsFatalError = i.IsFatal,
                Checked = false,
                Line = i.Token.Position.Line,
                Description = i.Description,
                BackgroundBrush = i.IsFatal ? Brushes.Red : null
            });
        }
    }
}
使用LINQ查询语法?以下是类型和变量:

public class ProblemsList {
    public class Problem {
        public IToken Token { get; set; }
        public string Description { get; set; }
        public bool IsFatal { get; set; }
    }
    public List<Problem> Items { get { return problems; } }
}

public class ListViewItem {
    public bool IsFatalError { get; set; }
    public bool Checked { get; set; }
    public int Line { get; set; }
    public string Description { get; set; }
    public Brush BackgroundBrush { get; set; }
}

Dictionary<string, ProblemsList> problems;

Dictionary<string, ObservableCollection<ListViewItem>> listViewItems
    = new Dictionary<string, ObservableCollection<ListViewItem>>();

下面是我如何使用链式方法语法来实现它:

listViewItems = problems.ToDictionary(
    p => p.Key,
    p => new ObservableCollection<ListViewItem>(
        p.Value.Items.Select(
            i => new ListViewItem
                {
                    Token = i.Token,
                    IsFatalError = i.IsFatal,
                    Checked = false,
                    Line = i.Token.Position.Line,
                    Description = i.Description,
                    BackgroundBrush = i.IsFatal ? Brushes.Red : null
                }
            )
        )
    );

下面是我如何使用链式方法语法来实现它:

listViewItems = problems.ToDictionary(
    p => p.Key,
    p => new ObservableCollection<ListViewItem>(
        p.Value.Items.Select(
            i => new ListViewItem
                {
                    Token = i.Token,
                    IsFatalError = i.IsFatal,
                    Checked = false,
                    Line = i.Token.Position.Line,
                    Description = i.Description,
                    BackgroundBrush = i.IsFatal ? Brushes.Red : null
                }
            )
        )
    );

什么是问题,钥匙?假设问题属于ProblemsList@w0lf:抱歉,已修复此问题。实际上是:字典问题什么是问题,钥匙?假设问题属于ProblemsList@w0lf:抱歉,已修复此问题。实际上是:字典问题谢谢!如何将其转换为查询表单?查询表单中没有ToDictionary。您可以将p.Value.Items.Select转换为查询,但我认为没有理由这样做。据我所知,ToDictionary不能以查询形式表示。您所能做的最好是将尽可能多的内容转换为查询表单,然后在其上应用ToDictionary。@w0lf-是的,正是-尽可能多的查询表单,都用括号和ToDictionary包围,比如:/*…query…*/.ToDictionary/*这里是什么?*/@Tal查询表单及其等价的metod表单都编译为相同的代码,实际上查询表单被转换为方法——例如在LINQPad中可以看到。我最关心的是可读性,在这种情况下,我认为使用这些方法会更好。我通常在枚举多个不同的源或使用join语句时使用查询表单。但实际上,在这种情况下,我认为可能有另一种很好的方式用查询表单来表达这一点,我将在另一个答案中显示它。谢谢!如何将其转换为查询表单?查询表单中没有ToDictionary。您可以将p.Value.Items.Select转换为查询,但我认为没有理由这样做。据我所知,ToDictionary不能以查询形式表示。您所能做的最好是将尽可能多的内容转换为查询表单,然后在其上应用ToDictionary。@w0lf-是的,正是-尽可能多的查询表单,都用括号和ToDictionary包围,比如:/*…query…*/.ToDictionary/*这里是什么?*/@Tal查询表单及其等价的metod表单都编译为相同的代码,实际上查询表单被转换为方法——例如在LINQPad中可以看到。我最关心的是可读性,在这种情况下,我认为使用这些方法会更好。我通常在枚举多个不同的源或使用join语句时使用查询表单。但实际上,在这种情况下,我认为可能有另一种很好的方式用查询表单来表达这一点,我将在另一个答案中展示它。