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语句时使用查询表单。但实际上,在这种情况下,我认为可能有另一种很好的方式用查询表单来表达这一点,我将在另一个答案中展示它。