2011-02-09 14 views

Respuesta

12

Puede utilizar LINQ:

String str = @"a 
b 
c 
d 
e"; 

int n = 2; 
string[] lines = str 
    .Split(Environment.NewLine.ToCharArray()) 
    .Skip(n) 
    .ToArray(); 

string output = string.Join(Environment.NewLine, lines); 

// Output is 
// "c 
// d 
// e" 
+3

me gano, pero necesitas 'StringSplitOptions.RemoveEmptyEntries' porque Split interpreta \ r y \ n por separado – Marlon

+1

@Marlon - No estoy seguro de si la eliminación de entradas vacías es un requisito en la pregunta. Supuse que no era así porque la pregunta se centraba en líneas y no en caracteres/palabras. – Omar

+3

¿se acobardó para obtener todo en una sola línea ilegible? ¿Llamar a eso un uso apropiado de LINQ? ;) – Massif

0

intente lo siguiente:

private static string DeleteLines(string input, int lines) 
    { 
     var result = input; 
     for(var i = 0; i < lines; i++) 
     { 
      var idx = result.IndexOf('\n'); 
      if (idx < 0) 
      { 
       // do what you want when there are less than the required lines 
       return string.Empty; 
      } 
      result = result.Substring(idx+1); 
     } 
     return result; 
    } 

Nota: Este método no es ideal para cadenas de múltiples líneas muy largas, ya que no tiene en cuenta la gestión de memoria. Si se trata de este tipo de cadenas, le sugiero que modifique el método para usar la clase StringBuilder.

+0

¿Por qué no acaba de encontrar la enésima '\ n' y hacer una única subcadena a partir de ese punto en adelante. Muchas de las respuestas anteriores son realmente ineficientes. Esperaba que esta lo hiciera de la manera más simple. Veo que fue la respuesta de @Lukáš Novotný (hizo referencia, pero no repitió aquí). –

3

Pruebe lo siguiente:

public static string DeleteLines(string s, int linesToRemove) 
{ 
    return s.Split(Environment.NewLine.ToCharArray(), 
        linesToRemove + 1 
     ).Skip(linesToRemove) 
     .FirstOrDefault(); 
} 

el siguiente ejemplo:

string str = @"a 
b 
c 
d 
e"; 
string output = DeleteLines(str, 2); 

vuelve

c 
d 
e 
+0

Si el contenido tiene líneas vacías, devuelve el resultado incorrecto a medida que se eliminan – Gusman

+0

@Gusman: suficiente, gracias. Corregido – Alex

10

Si es necesario tomar en cuenta "\ r \ n" y "\ r "y" \ n "es mejor usar la siguiente expresión regular:

public static class StringExtensions 
{ 
    public static string RemoveFirstLines(string text, int linesCount) 
    { 
     var lines = Regex.Split(text, "\r\n|\r|\n").Skip(linesCount); 
     return string.Join(Environment.NewLine, lines.ToArray()); 
    } 
} 

Here son algunos detalles más sobre la división de texto en líneas.

0

Con capacidad de eliminar primeros n líneas o últimos n líneas:

public static string DeleteLines(
    string stringToRemoveLinesFrom, 
    int numberOfLinesToRemove, 
    bool startFromBottom = false) { 
      string toReturn = ""; 
      string[] allLines = stringToRemoveLinesFrom.Split(
        separator: Environment.NewLine.ToCharArray(), 
        options: StringSplitOptions.RemoveEmptyEntries); 
      if (startFromBottom) 
       toReturn = String.Join(Environment.NewLine, allLines.Take(allLines.Length - numberOfLinesToRemove)); 
      else 
       toReturn = String.Join(Environment.NewLine, allLines.Skip(numberOfLinesToRemove)); 
      return toReturn; 
} 
1

Prueba esto:

public static string DeleteLines (string text, int lineCount) { 
    while (text.Split('\n').Length > lineCount) 
     text = text.Remove(0, text.Split('\n')[0].Length + 1); 
    return text; 
} 

Puede que no sea muy eficiente, pero funciona perfectamente para la pequeña proyecto en el que he estado trabajando recientemente

1
public static string DeleteLines(string input, int linesToSkip) 
{ 
    int startIndex = 0; 
    for (int i = 0; i < linesToSkip; ++i) 
     startIndex = input.IndexOf('\n', startIndex) + 1; 
    return input.Substring(startIndex); 
} 
+1

Es mejor incluir algún contexto/explicación con código, ya que hace que la respuesta sea más útil para el OP y para futuros lectores (especialmente porque esta es una pregunta antigua que ya tiene muchas otras respuestas de alta calidad). – EJoshuaS

Cuestiones relacionadas