2010-04-09 14 views

Respuesta

18

rápida y fácil, suponiendo \ r \ no \ n es su secuencia de nueva línea

string GetLine(string text, int lineNo) 
{ 
    string[] lines = text.Replace("\r","").Split('\n'); 
    return lines.Length >= lineNo ? lines[lineNo-1] : null; 
} 
+0

Qué acerca del uso Environment.NewLine en su lugar? –

+2

String.Split() solo acepta caracteres, y si pasa Environment.NewLine.ToCharArray() todas las demás líneas estarán vacías (edit: en Windows, Unix funcionará bien) – EventHorizon

+2

StringSplitOptions.RemoveEmptyEntries –

2

Si ya tiene una instancia de cadena, puede usar String.Split para dividir cada línea y comprobar si la línea 65 está disponible y, de ser así, usarla.

Si el contenido está en un archivo, use File.ReadAllLines para obtener una matriz de cadenas y luego haga la misma comprobación mencionada anteriormente. Esto funcionará bien para archivos pequeños, si su archivo es grande, considere leer una línea a la vez.

using (var reader = new StreamReader(File.OpenRead("example.txt"))) 
{ 
    reader.ReadLine(); 
} 
0

Aparte de tomar ventaja de una estructura de archivos específicos y operaciones de archivo de nivel inferior, no creo que los theres ninguna manera más rápida que leer 64 líneas, descartarlos y luego leer la línea 65a y la guardan. En cada paso, puede verificar fácilmente si ha leído el archivo completo.

4

Se puede usar un System.IO.StringReader por encima de su cadena. Entonces podría usar ReadLine() hasta llegar a la línea que deseaba o quedarse sin cadena.

Como todas las líneas podrían tener una longitud diferente, no hay ningún atajo para saltar directamente a la línea 65.

Cuando Split() una cadena que se duplica, lo que también duplicar el consumo de memoria.

0

theString. Split ("\ n" .ToCharArray()) [64]

+0

propenso a error de indexación fuera de límites – Amsakanna

+0

Devolverá la línea 65 y obtendrá '\ r' al comienzo de todas las líneas devueltas en entornos donde Environment.NewLine sea" \ r \ n "(Windows) . – EventHorizon

+0

sí, fui rápido en esa respuesta. La idea general es muy útil. Excepto, es un poco lento cuando se trata de cadenas de miles de líneas. Cuando se trata de líneas nuevas, depende de la fuente de la cadena. Si está escrito solo con \ n, sin \ r, entonces no funcionaría. El formato de la cadena no depende del entorno, ¿verdad? Las expresiones regulares harían el trabajo en este caso, pero más lento. – AlexanderMP

2

Lo que puede hacer es dividir la cadena según el carácter de nueva línea.

string[] strLines = yourString.split(Environment.NewLine); 
if(strLines.Length > lineNumber) 
{ 
    return strLines[lineNumber]; 
} 
+0

Esto no funciona, no podemos convertir cadena a char []. – savi

6
private static string ReadLine(string text, int lineNumber) 
{ 
    var reader = new StringReader(text); 

    string line; 
    int currentLineNumber = 0; 

    do 
    { 
     currentLineNumber += 1; 
     line = reader.ReadLine(); 
    } 
    while (line != null && currentLineNumber < lineNumber); 

    return (currentLineNumber == lineNumber) ? line : 
               string.Empty; 
} 
Cuestiones relacionadas