这是我编写的原始代码(用于测试目的):
List<A037Line> a037Lines = new List<A037Line>();
foreach (var textFile in propassBatchFolder.TextFiles)
{
foreach (var a037Line in textFile.A037Lines)
{
if (a037Line.NISS == "80061031738")
{
a037Lines.Add(a037Line);
}
}
}
Resharper建议使用以下LINQ代码:
List<A037Line> a037Lines = (from textFile in propassBatchFolder.TextFiles
from a037Line in textFile.A037Lines
where a037Line.NISS == "80061031738"
select a037Line).ToList();
由于我是LINQ的初学者,这个LINQ表达式的“点缀”版本是什么?
例如:
propassBatchFolder.TextFiles.Where(…).Select()….ToList()
非常感谢提前: - )
答案 0 :(得分:1)
我不是100%确定它是确切的语法等价物,但它在语义上是相同的:
List<A037Line> a037Lines =
propassBatchFolder.TextFiles.
SelectMany(textFile => textFile.A037Lines).
Where(a037Line => a037Line.NISS == "80061031738").
ToList();
答案 1 :(得分:1)
如果从内部开始,将嵌套循环转换为查询会更容易。
首先转换内部循环:
foreach (var textFile in propassBatchFolder.TextFiles) {
a037Lines.AddRange(
textFile.A037Lines.Where(a037Line => a037Line.NISS == "80061031738")
);
}
现在,您可以使用SelectMany
:
var res = propassBatchFolder
.TextFiles
.SelectMany(textFile => textFile.A037Lines.Where(a037Line => a037Line.NISS == "80061031738"))
.ToList();
最后,您可以通过移出Where
内的SelectMany
来减少嵌套:
var res = propassBatchFolder
.TextFiles
.SelectMany(textFile => textFile.A037Lines)
.Where(a037Line => a037Line.NISS == "80061031738")
.ToList();
最终结果是相同的,但最终版本更具可读性。