将详细的LINQ语句翻译成“虚线”版本

时间:2016-03-30 14:23:19

标签: c# linq

这是我编写的原始代码(用于测试目的):

        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()

非常感谢提前: - )

2 个答案:

答案 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();

最终结果是相同的,但最终版本更具可读性。