2011-12-20 20 views
6

Così sto creando una lista di righe in un file di testo come questo:Ottenere ultime due righe in un file di testo

var lines = File.ReadAllLines("C:\\FileToSearch.txt") 
       .Where(x => !x.EndsWith("999999999999")); 

e loop attraverso le linee come questo

foreach (var line in lines) 
{ 
    if (lineCounter == 1) 
    { 
     outputResults.Add(oData.ToCanadianFormatFileHeader()); 
    } 
    else if (lineCounter == 2) 
    { 
     outputResults.Add(oData.ToCanadianFormatBatchHeader()); 
    } 
    else 
    { 
     oData.FromUsLineFormat(line); 
     outputResults.Add(oData.ToCanadianLineFormat()); 

    } 
    lineCounter = lineCounter + 1; 
    textBuilder += (line + "<br>"); 
} 

Analogamente, come ho accedi alle prime due righe Desidero accedere all'ultima e alla penultima riga singolarmente

+0

Ho suggerito una modifica che aggiunge il tag C# a questo. È una domanda sull'elaborazione del file di testo usando C# - asp.net non entra nell'equazione. – jadarnel27

risposta

11

Qui puoi approfittare di LINQ ancora una volta:

var numberOfLinesToTake = 2; 
var lastTwoLines = lines 
    .Skip(Math.Max(0, lines.Count() - numberOfLinesToTake)) 
    .Take(numberOfLinesToTake); 

var secondToLastLine = lastTwoLines.First(); 
var lastLine = lastTwoLines.Last(); 

Oppure, se si desidera recuperare individualmente:

var lastLine = lines.Last(); 
var secondToLastLine = 
    lines.Skip(Math.Max(0, lines.Count() - 2)).Take(1).First(); 

ho aggiunto .First() fino alla fine, perché .Take(1) restituirà una matrice contenente una voce, che poi afferrare con First(). Questo può probabilmente essere ottimizzato.

Ancora una volta, potresti voler familiarizzare con LINQ poiché a volte è un vero risparmio di tempo.

+1

Solo per curiosità, il '.Take()' è davvero necessario qui? Il '.Skip()' non restituirà tutto tranne gli ultimi due? –

+0

@KileyNaro sì '.Skip()' restituisce tutto ciò che è necessario. Ho aggiunto '.Take()' per rendere il concetto più esplicito. Nel mio secondo esempio, '.Take (1)' è sicuramente richiesto. –

0

Questo uno dei problemi dell'utilizzo di var quando non è appropriato.

ReadAllLines restituisce un array di stringhe: string []

è possibile ottenere la lunghezza della matrice e l'indice all'indietro dalla fine.

Problemi correlati