Какой самый простой способ в C # обрезать символ новой строки? - PullRequest
99 голосов
/ 24 июня 2009

Я хочу убедиться, что _content не заканчивается символом NewLine:

_content = sb.ToString().Trim(new char[] { Environment.NewLine });

, но код выше не работает , поскольку в Trim, похоже, нет перегруженного параметра для набора строк, только символы.

Какая простейшая однострочная строка для удаления Enivronment.Newline с конца строки?

Ответы [ 10 ]

221 голосов
/ 24 июня 2009

У меня работает следующее.

sb.ToString().TrimEnd( '\r', '\n' );

или

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());
29 голосов
/ 06 мая 2013

.Trim() удаляет \r\n для меня (с помощью .NET 4.0).

14 голосов
/ 24 июня 2009

Как насчет:

public static string TrimNewLines(string text)
{
    while (text.EndsWith(Environment.NewLine))
    {
        text = text.Substring(0, text.Length - Environment.NewLine.Length);
    }
    return text;
}

Это несколько неэффективно, если есть несколько новых строк, но это будет работать.

В качестве альтернативы, если вы не возражаете против обрезки (скажем) "\r\r\r\r" или "\n\n\n\n", а не просто "\r\n\r\n\r\n":

// No need to create a new array each time
private static readonly char[] NewLineChars = Environment.NewLine.ToCharArray();

public static string TrimNewLines(string text)
{
    return text.TrimEnd(NewLineChars);
}
8 голосов
/ 24 июня 2009

Используйте Framework. Метод ReadLine () может сказать следующее:

Строка определяется как последовательность символы, сопровождаемые переводом строки ("\ n"), возврат каретки ("\ r") или возврат каретки сразу последовал переводом строки ("\ r \ n"). Строка то, что возвращается, не содержит завершение возврата каретки или строки кормить.

Таким образом, следующее сделает свое дело

_content = new StringReader(sb.ToString()).ReadLine();
5 голосов
/ 24 июня 2009

А как же

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());
4 голосов
/ 24 июня 2009
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Это, конечно, удалит "\ r \ r \ r \ r", а также "\ n \ n \ n \ n" и другие комбинации. А в «средах», где NewLine отличается от «\ n \ r», вы можете получить странное поведение: -)

Но если вы можете с этим смириться, то я верю, что это самый эффективный способ удаления символов новой строки в конце строки.

2 голосов
/ 24 июня 2009

Как насчет просто:

string text = sb.ToString().TrimEnd(null)

Это вытянет все пробельные символы из конца строки - только проблема, если вы хотите сохранить пробелы без перевода строки.

1 голос
/ 24 июня 2009

В некотором смысле это не ответ, но самый простой способ обрезать символ новой строки вне строки - это вообще не использовать символ новой строки в строке, убедившись, что он никогда не будет виден в вашем собственном коде. То есть с помощью собственных функций, которые удаляют символ новой строки. Многие методы stream и file / io не будут содержать символ новой строки, если вы запрашиваете вывод построчно, хотя может потребоваться обернуть что-то в System.IO.BufferedStream.

Такие вещи, как System.IO.File.ReadAllLines, могут использоваться вместо System.IO.File.ReadAllText большую часть времени, и ReadLine может использоваться вместо Read, если вы работаете с нужным типом потока (например, BufferedStream) .

0 голосов
/ 16 октября 2014

Как отметил Маркус, TrimEnd делает эту работу сейчас. Мне нужно было получить перевод строки и пробелы с обоих концов строки в среде Windows Phone 7.8. После того, как я выбрал другие более сложные опции, моя проблема была решена с помощью только Trim () - хорошо прошел следующие тесты

   [TestMethod]
    [Description("TrimNewLines tests")]
    public void Test_TrimNewLines()
    {
        Test_TrimNewLines_runTest("\n\r     testi    \n\r", "testi");
        Test_TrimNewLines_runTest("\r     testi    \r", "testi");
        Test_TrimNewLines_runTest("\n     testi    \n", "testi");
        Test_TrimNewLines_runTest("\r\r\r\r\n\r     testi   \r\r\r\r \n\r", "testi");
        Test_TrimNewLines_runTest("\n\r  \n\n\n\n   testi äål.,    \n\r", "testi äål.,");
        Test_TrimNewLines_runTest("\n\n\n\n     testi  ja testi  \n\r\n\n\n\n", "testi  ja testi");
        Test_TrimNewLines_runTest("", "");
        Test_TrimNewLines_runTest("\n\r\n\n\r\n", "");
        Test_TrimNewLines_runTest("\n\r \n\n \n\n", "");
    }

    private static void Test_TrimNewLines_runTest(string _before, string _expected)
    {
        string _response = _before.Trim();
        Assert.IsTrue(_expected == _response, "string '" + _before + "' was translated to '" + _response + "' - should have been '" + _expected + "'");
    }
0 голосов
/ 15 сентября 2011

Мне пришлось удалить новые строки по всему тексту. Поэтому я использовал:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...