2013-07-30 2 views
-6

Я разрабатываю приложение осуществлять поиск внутри файлов, я написал следующий код, чтобы сделать это:прочитать файл и получить строку текста Linq

 foreach (var file in filesInDir) 
     { 
      string[] lines = File.ReadAllLines(file.FullName); 
      for(int i=0;i<lines.Length;i++) 
       if(lines[i].Contains("123456789")) 
        Console.Write("File: {0}\nLine: {1}", file.FullName, i + 1); 
     } 

Так, интересно, как я могу выполнить это исследование , используя Linq, можно ли это сделать?

+1

ваш ответ прямо здесь, на этой странице, 'Related' секции есть почта уже показывает, как' Чтение TexFile с использованием Linq' – MethodMan

ответ

7

Выберите строку вместе с индексом (номер строки), а затем запросить для строки, а затем выберите LineNo как:

var result = lines.Select((r, i) => new { line = r, index = i }) 
       .Where(r => r.line.Contains("123456789")) 
       .Select(r => new { LineNo = r.index }); 

Для отображения:

foreach(var item in result) 
    Console.Write("File: {0}\nLine: {1}", file.FullName, item.LineNo); 

EDIT

Вы также можете попробовать t он следующий для всех файлов в каталоге, как:

var result = filesInDir.Select(t => new { lines = File.ReadAllLines(t.FullName), FileName = t.Name }) 
      .Select((r, i) => new { line = r.lines, index = i, FileName = r.FileName }) 
      .Where(r => r.line.Contains("123456789")) 
      .Select(r => new { FileName = r.FileName, LineNo = r.index }); 

Тогда для отображения:

foreach (var item in result) 
    Console.Write("File: {0}\nLine: {1}", item.FileName, item.LineNo); 
+0

+1. Но подумайте об использовании 'File.ReadLines', а не' File.ReadAllLines'. –

2
var lines = File.ReadAllLines(file.FullName).ToList();  

lines.Where(x=>x.Contains("123456790")).ToList().ForEach(x=>Console.Write("File: {0}\nLine: {1}", x.FullName, lines.IndexOf(x))); 
+0

Хорошо, но как я могу получить номер строки? – Alexandre

+0

@Alexandre отредактировал – wudzik

+2

'lines.IndexOf (x)'? очень жаль. – I4V

Смежные вопросы