2011-02-09 14 views

risposta

12

È possibile utilizzare 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

mi ha battuto ad esso, ma è necessario 'StringSplitOptions.RemoveEmptyEntries' dal Split interpreta \ r \ n separatamente – Marlon

+1

@Marlon - io non sono sicuro se la rimozione di voci vuote era un requisito in questione. Ho pensato che non era da quando la domanda si concentrava sulle linee e non sui personaggi/parole. – Omar

+3

ti sei beccato per aver preso tutto in una riga illeggibile? Chiamare un uso corretto di LINQ? ;) – Massif

0

provare quanto segue:

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: Questo metodo non è ideale per estremamente lunghe stringhe multilinea in quanto non considera la gestione della memoria. Se si ha a che fare con questo tipo di stringhe, suggerisco di modificare il metodo per usare la classe StringBuilder.

+0

Perché non trovare l'ennesimo '\ n' e fare una singola sottostringa da quel punto in poi. Molte delle risposte di cui sopra sono davvero inefficienti. Mi aspettavo che questo lo facesse nel modo più semplice. Vedo che è stata la risposta di @ Lukáš Novotný (si è riferito, ma non si è ripetuto qui). –

3

Provare quanto segue:

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

l'esempio successivo:

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

rendimenti

c 
d 
e 
+0

Se il contenuto ha linee vuote restituisce il risultato errato man mano che vengono rimossi – Gusman

+0

@Gusman: abbastanza giusto, grazie. Corretto. – Alex

10

Se avete bisogno di prendere in considerazione "\ r \ n" e "\ r" e '\ n' è meglio utilizzare la seguente espressione regolare:

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 sono alcuni ulteriori dettagli sul testo dividendosi in linee.

0

Con possibilità di cancellare primi n linee o ultimi n linee:

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

Prova questo:

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; 
} 

Potrebbe non essere molto efficiente, ma funziona perfettamente per il piccolo progetto a cui ho lavorato di recente

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

E 'meglio includere po' di contesto/spiegazione con codice come questo rende la risposta più utile per il PO e per i lettori futuri (soprattutto perché questa è una vecchia questione che ha già diverse altre risposte di alta qualità). – EJoshuaS

Problemi correlati