Метод LINQ Select
has a overload, который проходит по индексу объекта.
Dim startFolder = "C:\Users\me\Documents\Visual Studio 2012\Projects\project"
Dim matches =
From f In Directory.EnumerateFiles(startFolder, "*.vb", SearchOption.AllDirectories)
From l In File.ReadLines(f).Select(Function(x, i) New With { .Line = x, .LineNo = i + 1})
Where l.Line.Contains(word2Search)
Select FileName = f, LineNo = l.LineNo, Line = l.Line
совпадений будет IEnumerable
объектов с FileName
, LineNo
и Line
свойствами.
UPDATE
Чтобы получить имя файла и массив индексов соответствия строки, вы могли бы сделать что-то вроде этого:
Dim matches =
From f In Directory.EnumerateFiles(startFolder, "*.vb", SearchOption.AllDirectories)
From l In File.ReadLines(f).Select(Function(x, i) New With { .Line = x, .LineNo = i + 1})
Where l.Line.Contains(word2Search)
Select File = f, LineNo = l.LineNo
Group By File Into g = Group
Select FileName = File, LineNos = g.Select(Function(x) x.LineNo).ToArray()
Это даст вам IEnumerable
объектов с FileName
и LineNos
Недвижимость.
Для поиска позиций спичек в строках требуется еще несколько изменений, так как Contains
просто возвращает Boolean
. Вы можете использовать Regex.Matches
найти позиции матчей в линии, так:
Dim matches =
From f In Directory.EnumerateFiles(startFolder, "*.vb", SearchOption.AllDirectories)
From l In File.ReadLines(f).Select(Function(x, i) New With { .Line = x, .LineNo = i + 1})
Where l.Line.Contains(word2Search)
Select File = f, LineNo = l.LineNo,
MatchPositions = Regex.Matches(l.Line, Regex.Escape(word2Search)).Cast(Of Match)().Select(Function(x) x.Index)
Group By File Into g = Group
Select FileName = File, Matched = g.Select(Function(x) New With { x.LineNo, .Positions = x.MatchPositions.ToArray() }).ToArray()
После этого, вы в конечном итоге с IEnumerable
объектов с FileName
и Matched
свойствами (к сожалению, VB.NET не понравилось, что называемый Matches
, потому что это противоречит переменной matches
, но вы можете поиграть с ней по своему вкусу). Свойство Matched
представляет собой массив объектов с объектами LineNo
и Positions
, причем Positions
является массивом индексов в строках (на основе нуля, поэтому добавьте + 1
туда, если хотите).
Что делать, если этот термин появляется несколько раз в файле? –
@FarhanAnam, тогда я хотел бы, чтобы он дал мне знать, какие строки находятся внутри этого документа. ** (пример: строки 15, 22, 108) ** – StealthRT