C # 'da bir dizeden yeni satırı kırpmanın en kolay yolu nedir?


115

_Content'in bir NewLine karakteriyle bitmediğinden emin olmak istiyorum:

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

ancak yukarıdaki kod çalışmıyor çünkü Trim bir dizi dizge için aşırı yüklenmiş bir parametreye sahip değil, sadece karakterler.

Bir Enivronment.Newline'ı bir dizenin sonundan kaldırmak için en basit tek satırlık nedir?


4
btw, muhtemelen TrimEnd
Marc

Yanıtlar:


260

Aşağıdakiler benim için çalışıyor.

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

veya

sb.ToString().TrimEnd( Environment.NewLine.ToCharArray());

çok özlü ve konuyla ilgileniyor, güzel
Edward Tanguay

1
Yeni bir satır karakterini oluşturan HERHANGİ bir karakter kombinasyonunu kırpmak, altta yatan sorunu ve sorunun ruhunu ele alırken, genel anlamda istenmeyen işlevsellik potansiyeli de bırakır. Bir dosya işleme senaryosunda, ilk \ n HeresALineForUnixToBeFedFromWindows \ n \ r \ n dizesinde olduğu gibi bırakılmasının gerekliliğini görebiliyordum. Daha ayrıntılı olsa da, John Skeet'in cevabı muhtemelen en iyisidir ve Scott Weinstein'ın ReadLine'ı da daha "doğrudur" (belki biraz daha fazla ek yük ile de olsa)
b_levitt

26
TrimEnd () zaten İşi Parametreler olmadan yapıyor! msdn.microsoft.com/de-de/library/… ve msdn.microsoft.com/de-de/library/…
Markus

3
@Markus Teşekkürler Bunu buldum çünkü bu davranışı istemiyorum ama yaşıyordum. Ben beyaz bir boşluk değildi, ama o ve .TrimEnd ve .rim tüm beyaz boşluk karakterlerini yerel olarak temizle
David Carrigan

39

.Trim()\r\nbenim için kaldırır (.NET 4.0 kullanarak).


14

Peki ya:

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

Birden çok yeni satır varsa bu biraz verimsizdir, ancak işe yarayacaktır.

Alternatif olarak, kısaltması (söyleyin) "\r\r\r\r"veya "\n\n\n\n"sadece "\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);
}

1
Muhtemelen en doğru çözüm, ancak tek satırlık bir çözüm değil :-)
bang

9

Çerçeveyi kullanın. ReadLine () yöntemi şunları söylemek için şunları içerir:

Bir satır, bir satır besleme ("\ n"), bir satır başı ("\ r") veya hemen ardından bir satır besleme ("\ r \ n") gelen bir karakter dizisi olarak tanımlanır. Döndürülen dize, sonlanan satır başı veya satır beslemesini içermez.

Yani aşağıdakiler hile yapacak

_content = new StringReader(sb.ToString()).ReadLine();

1
Zarif evet, ancak bu satırı okuyan diğer kişiler için anlaşılması kolay değil.
Açıklayıcı bir yoruma ihtiyaç var

1
Dizede birden fazla satır olduğunda ve yalnızca son boş satırı kaldırmak istediğinizde olmaz.
Florian Berger

6

Ne dersin

_content = sb.ToString().Trim(Environment.NewLine.ToCharArray());

Bu tam olarak aynı şeyi yapmaz - örneğin, Environment.NewLine crlf olsa bile "abc \ n \ n \ n \ n \ n" kesilir
Marc Gravell

1
Bunu bir özellik olarak bildirin :-) Çözümü beğendim.
Stefan Steinegger

5
_content = sb.TrimEnd(Environment.NewLine.ToCharArray());

Bu tabii ki "\ r \ r \ r \ r" ile birlikte "\ n \ n \ n \ n" ve diğer kombinasyonları kaldıracaktır. Ve NewLine'ın "\ n \ r" dışında olduğu "ortamlarda" bazı garip davranışlar görebilirsiniz :-)

Ancak bununla yaşayabilirseniz, bunun bir dizenin sonundaki yeni satır karakterlerini kaldırmanın en etkili yolu olduğuna inanıyorum.


3

Peki ya sadece:

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

Bu, dizenin sonundaki tüm beyaz boşluk karakterlerini çekecektir - yalnızca satırsonu olmayan beyaz boşluğu korumak istiyorsanız bir sorun olabilir.


1

Biraz cevapsız, ancak bir dizeden bir satırsonu satırını kesmenin en kolay yolu, kendi kodunuz tarafından hiçbir zaman görülmediğinden emin olarak, satırsonu satırının ilk başta olmamasıdır. Yani, yeni satırı kaldıran yerel işlevler kullanarak. Çoğu akım ve dosya / io yöntemi, satır satır çıktı talep ederseniz satırsonunu içermeyecektir, ancak bir şeyi bir System.IO.BufferedStream.

Bu tür şeyler çoğu zaman System.IO.File.ReadAllLinesyerinde kullanılabilir ve doğru türdeki akışla (örneğin ) çalıştığınızda bunun yerine kullanılabilir .System.IO.File.ReadAllTextReadLineReadBufferedStream


0

Markus'un işaret ettiği gibi, TrimEnd işi şimdi yapıyor. Windows Phone 7.8 ortamında dizenin her iki ucundan satır beslemeleri ve beyaz boşluk almam gerekiyordu. Farklı daha karmaşık seçenekleri takip ettikten sonra sorunum yalnızca Trim () kullanılarak çözüldü - aşağıdaki testleri güzelce geçti

   [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 + "'");
    }

-2

Metnin her yerinden yeni satırları kaldırmak zorunda kaldım. Ben de kullandım:

            while (text.Contains(Environment.NewLine))
            {
                text = text.Substring(0, text.Length - Environment.NewLine.Length);
            }

1
Metin, sonunda olmayan Yeni Satır (lar) içeriyorsa, bu bir felaket olacaktır.
Stefan Bergfeldt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.