Tôi có một phương thức thực hiện một 'grep' đơn giản trên các tệp, sử dụng một số "chuỗi tìm kiếm". (Có hiệu quả, tôi đang làm rất ngây thơ "Tìm Mọi Tham khảo")Làm thế nào để làm cho một C# 'grep' hơn Chức năng sử dụng LINQ?
IEnumerable<string> searchStrings = GetSearchStrings();
IEnumerable<string> filesToLookIn = GetFiles();
MultiMap<string, string> references = new MultiMap<string, string>();
foreach(string fileName in filesToLookIn)
{
foreach(string line in File.ReadAllLines(fileName))
{
foreach(string searchString in searchStrings)
{
if(line.Contains(searchString))
{
references.AddIfNew(searchString, fileName);
}
}
}
}
Lưu ý: MultiMap<TKey,TValue>
là gần giống như Dictionary<TKey,List<TValue>>
, chỉ cần tránh NullReferenceExceptions bạn thường gặp phải.
Tôi đã cố gắng đưa điều này vào một phong cách "chức năng" hơn, bằng cách sử dụng các phương pháp mở rộng LINQ bị xích nhưng chưa tìm ra.
Một nỗ lực cụt:
// I get lost on how to do a loop within a loop here...
// plus, I lose track of the file name
var lines = filesToLookIn.Select(f => File.ReadAllLines(f)).Where(// ???
Và khác (hy vọng duy trì tên tập tin thời gian này):
var filesWithLines =
filesToLookIn
.Select(f => new { FileName = f, Lines = File.ReadAllLines(f) });
var matchingSearchStrings =
searchStrings
.Where(ss => filesWithLines.Any(
fwl => fwl.Lines.Any(l => l.Contains(ss))));
Nhưng tôi vẫn dường như mất thông tin mà tôi cần.
Có lẽ tôi đang tiếp cận điều này từ góc độ sai? Từ quan điểm hiệu suất, các vòng lặp phải thực hiện theo thứ tự tương tự như ví dụ ban đầu.
Bất kỳ ý tưởng nào về cách thực hiện điều này trong một đại diện chức năng nhỏ gọn hơn?
Tôi không biết bạn có thể sử dụng nhiều "từ" tuyên bố như thế. Làm thế nào mà thực sự làm việc? Trải nghiệm của tôi với LINQ hoàn toàn thông qua lambdas và các phương pháp mở rộng. Điều này thậm chí dịch để xích các phương pháp mở rộng? –
Có, nhiều từ các mệnh đề chuyển thành các cuộc gọi đến phương thức mở rộng SelectMany. Kiểm tra nó trong Reflector để xem chính xác những gì đang xảy ra. – dahlbyk
@jmitchem: Tôi đã chỉnh sửa câu trả lời của mình để giải quyết các câu hỏi của bạn. –