Следующий пример несколько искусственный; он может быть реализован с помощью одного выражения запроса, но я хотел использовать два выражения запроса, чтобы продемонстрировать ленивость обработки. Никакие строки не читаются из текстового файла до тех пор, пока программа не повторится по результатам второго выражения запроса.
Реализация тривиальная. Следующий список содержит как метод расширения, а также код для использования методы расширения:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
namespace LinqToText
{
public static class StreamReaderSequence
{
public static IEnumerable<string> Lines(this StreamReader source)
{
String line;
if (source == null)
throw new ArgumentNullException("source");
while ((line = source.ReadLine()) != null)
{
yield return line;
}
}
}
class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader("TextFile.txt");
var t1 =
from line in sr.Lines()
let items = line.Split(',')
where ! line.StartsWith("#")
select String.Format("{0}{1}{2}",
items[1].PadRight(16),
items[2].PadRight(16),
items[3].PadRight(16));
var t2 =
from line in t1
select line.ToUpper();
foreach (var t in t2)
Console.WriteLine(t);
sr.Close();
}
}
}
Если запустить этот пример со следующим текстом файлом:
#This is a comment
1,Eric,White,Writer
2,Bob,Jones,Programmer
3,Orville,Wright,Inventor
4,Thomas,Jefferson,Statesman
5,George,Washington,President
Он производит следующий вывод.
ERIC WHITE WRITER
BOB JONES PROGRAMMER
ORVILLE WRIGHT INVENTOR
THOMAS JEFFERSON STATESMAN
GEORGE WASHINGTON PRESIDENT
Это действительно приятное решение. – Contango