我有一個文件要讀入數組。用LINQ讀取文本文件
string[] allLines = File.ReadAllLines(@"path to file");
我知道我可以通過陣列迭代,並查找包含圖案的每一行並顯示的行號和行自身。
我的問題是:
是否有可能做同樣的事情與LINQ?
我有一個文件要讀入數組。用LINQ讀取文本文件
string[] allLines = File.ReadAllLines(@"path to file");
我知道我可以通過陣列迭代,並查找包含圖案的每一行並顯示的行號和行自身。
我的問題是:
是否有可能做同樣的事情與LINQ?
嗯,是 - 使用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查詢本身分開。
這樣的事情應該工作
var result = from line in File.ReadAllLines(@"path")
where line.Substring(0,1) == "a" // put your criteria here
select line
使用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]);
}
}
Bravo !!我認爲這會涉及一些可以讓我使用某種匿名類型的東西,但我不能把它們放在一起。 – coson 2011-04-06 22:57:52