2011-02-09 5 views

ответ

3

Комбинация Get the index of the nth occurrence of a string? (поиск) и Environment.NewLine подстроки должны сделать трюк.

+0

Не могли бы вы вставить соответствующие биты ответа, который вы упомянули в своем ответе? –

12

Вы можете использовать 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

избили меня, но вам нужно 'StringSplitOptions.RemoveEmptyEntries', так как Split интерпретирует \ r и \ n отдельно – Marlon

+1

@Marlon - Я не уверен, что удаление вопроса было вопросом в вопросе. Я полагал, что это не так, поскольку вопрос фокусируется на строках, а не на символах/словах. – Omar

+3

вы курили из всего этого в одной нечитаемой строке? Позвоните, чтобы использовать LINQ? ;) – Massif

0

Попробуйте следующее:

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

Примечание: Этот метод не подходит для очень длинных строк многострочных как он не считает управление памятью. Если вы имеете дело с этими типами строк, я предлагаю вам изменить метод использования класса StringBuilder.

+0

Почему бы просто не найти nth '\ n' и сделать одну подстроку с этой точки дальше. Поэтому многие из вышеперечисленных ответов действительно неэффективны, я ожидал, что это сделает это простым способом. Я вижу, что это был ответ @ Lukáš Novotný (он ссылался, но не повторял здесь). –

3

Попробуйте следующее:

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

следующий пример:

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

возвращает

c 
d 
e 
+0

Если у содержимого есть пустые строки, он возвращает неверный результат по мере удаления – Gusman

+0

@Gusman: достаточно справедливо, спасибо. Исправленный. – Alex

10

Если вам нужно принять во внимание "\ г \ п" и «\ r "и" \ n ", лучше использовать следующее регулярное выражение:

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 более подробная информация о разбиении текста на строки.

0

С возможностью удаления первые п линии или последней п линии:

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

Попробуйте это:

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

Это может быть не очень эффективным, но она прекрасно работает для самых маленьких проект, над которым я недавно работал

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

Лучше включить некоторый контекст/объяснение с кодом, поскольку это делает ответ более полезным для OP и для будущих читателей (тем более, что это старый вопрос, который уже содержит несколько других высококачественных ответов). – EJoshuaS

Смежные вопросы