使用LINQ读取文本文件

使用LINQ读取文本文件,linq,Linq,我有一个要读入数组的文件 string[] allLines = File.ReadAllLines(@"path to file"); 我知道我可以遍历数组,找到包含模式的每一行,并显示行号和行本身 我的问题是: 可以用LINQ做同样的事情吗?像这样的东西应该可以用 var result = from line in File.ReadAllLines(@"path") where line.Substring(0,1) == "a" // put your cri

我有一个要读入数组的文件

string[] allLines = File.ReadAllLines(@"path to file");
我知道我可以遍历数组,找到包含模式的每一行,并显示行号和行本身

我的问题是:


可以用LINQ做同样的事情吗?

像这样的东西应该可以用

var result = from line in File.ReadAllLines(@"path")
             where line.Substring(0,1) == "a" // put your criteria here
             select line

好的,是的-使用带有索引的
Select()
重载,我们可以通过投影到包含行本身及其行号的匿名类型来实现这一点:

var targetLines = File.ReadAllLines(@"foo.txt")
                      .Select((x, i) => new { Line = x, LineNumber = i })
                      .Where( x => x.Line.Contains("pattern"))
                      .ToList();

foreach (var line in targetLines)
{
    Console.WriteLine("{0} : {1}", line.LineNumber, line.Line);
}

由于控制台输出是一个副作用,它应该与LINQ查询本身分开。

使用LINQ是可能的。但是,由于您也需要行号,因此通过自己迭代,代码可能更具可读性:

    const string pattern = "foo";
    for (int lineNumber = 1; lineNumber <= allLines.Length; lineNumber++)
    {
        if (allLines[lineNumber-1].Contains(pattern))
        {
            Console.WriteLine("{0}. {1}", lineNumber, allLines[i]);
        }
    }
const string pattern=“foo”;

对于(int-lineNumber=1;lineNumber-Bravo!!我想这会涉及到一些允许我使用某种匿名类型的东西,我只是无法将两者结合起来。