L'exemple suivant est quelque peu artificiel; il pourrait être implémenté avec une seule expression de requête, mais je voulais utiliser deux expressions de requête pour démontrer la paresse du traitement. Aucune ligne n'est lue à partir du fichier texte jusqu'à ce que le programme itère sur les résultats de la deuxième expression de requête.
L'implémentation est triviale. La liste suivante contient à la fois la méthode d'extension ainsi que le code à utiliser la méthode d'extension:
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();
}
}
}
Si vous exécutez cet exemple avec le fichier texte suivant:
#This is a comment
1,Eric,White,Writer
2,Bob,Jones,Programmer
3,Orville,Wright,Inventor
4,Thomas,Jefferson,Statesman
5,George,Washington,President
Il produit la sortie suivante.
ERIC WHITE WRITER
BOB JONES PROGRAMMER
ORVILLE WRIGHT INVENTOR
THOMAS JEFFERSON STATESMAN
GEORGE WASHINGTON PRESIDENT
C'est une très bonne solution. – Contango