Dizenin son karakterini sil


261

Bir veritabanına bağlı bir listede çok fazla bilgi alıyorum ve web sitesine bağlı biri için gruplar dizesi oluşturmak istiyorum.

Bunu test etmek için kullanıyorum ama bu dinamik değil, bu yüzden gerçekten kötü:

string strgroupids = "6";

Bunu şimdi kullanmak istiyorum. Ama döndürülen dize şuna benzer1,2,3,4,5,

groupIds.ForEach((g) =>
{
    strgroupids = strgroupids  + g.ToString() + ",";
    strgroupids.TrimEnd(',');
});

strgroupids.TrimEnd(new char[] { ',' });

Ben Silmek istediğiniz ,sonra 5ama kesinlikle çalışmıyor.


9
Doğrudan sorunun çözümü şudur, strgroupids = strgroupids.TrimEnd(new char[] { ',' });ancak aşağıda daha iyi fikirler vardır.
Henk Holterman

Yanıtlar:


614
strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

String.Remove (Int32):

Belirtilen bir konumdan başlayıp son konumdan devam ederek bu dizeden tüm karakterleri siler


1
Son karakteri kaldırmak istiyorsanız son karakteri kaldırmak için mükemmeldir. OP sorusu için, izleyen bir karakter oluşturmazsanız sorun mevcut olmamalıdır. OP teknesinde iseniz @ Øyvind Bråthen çözümünü kontrol edin.
aloisdg taşınma codidact.com

86

Bu şekilde yapmaya ne dersin?

strgroupids = string.Join( ",", groupIds );

bir sürü temizleyici.

İçerideki tüm öğeleri her birine groupIdsbir arada ekler ',', ancak ','sonuna bir a koymaz.


4
Sadece C # 4.0'da. C # 3.5'te groupIds'ı diziye dönüştürmeniz gerekir.
xanatos

3
Bu OP sorununu çözecektir.
aloisdg taşınma codidact.com

29

C # dizeleri değişmez. Kodunuzdaki Bunu yaptığınızda strgroupids.TrimEnd(',');veya dize değiştirilmezstrgroupids.TrimEnd(new char[] { ',' });strgroupids .

Gibi bir şey yapmalısın strgroupids = strgroupids.TrimEnd(','); yerine .

Buradan alıntı yapmak için :

Dizeler değiştirilemez - sözdizimi bunu yapabiliyormuş gibi görünmesine rağmen, bir dize nesnesinin içeriği nesne oluşturulduktan sonra değiştirilemez. Örneğin, bu kodu yazdığınızda, derleyici aslında yeni karakter dizisini tutmak için yeni bir dize nesnesi oluşturur ve bu yeni nesne b'ye atanır. Daha sonra "h" dizesi çöp toplama için uygundur.


11

Bir uzantı yöntemi ekleyin.

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

sonra kullan:

yourString.RemoveLast(",");

Bir uzatma yöntemi yaratmanın temel fikri iyidir. Bununla birlikte, burada uygulanan yöntem IMHO, bu kullanım için aşırıdır. OP istediği karakterin dizenin sonunda olduğunu biliyordu, bu yüzden LastIndexOf aracılığıyla o dizeyi arama masrafına sahip olmak için hiçbir neden yok . Sadece kabul edilen cevabı alın ve bir uzatma yöntemi yapın. Ya da sonunda cevap int nkaldırılacak karakter sayısını ileterek bu yanıtı genelleştirin . İkincisi, sıfır uzunluğunu test edersiniz, ancak bu tüm olası istisnaları ortadan kaldırmaz. int index = ..LastIndexOf..Öyleyse yapmak daha iyi olurdu if (index >= 0).
ToolmakerSteve

Üçüncü olarak, parametre string characterkötü adlandırılmış. Dördüncüsü, gelecekteki programcılar için bunun dizenin sonundaki karakterleri kaldırdığı hemen belli değildir . Oh bekle, ille de öyle değil. Dize arıyor. Ortada bir yerden çıkarılıyor olabilir. Şimdi bakım programcısı, neyin gerçekleştirilmeye çalışıldığını görmek için yöntemin tüm kullanımlarını incelemelidir. Bir dizenin sonundan çıkarmanın bu basit ihtiyacı için aramak için iyi bir yöntem değil. Tüm eleştiriler için özür dilerim; Bunu bu yöntemi benimseyen herkes için yapıyorum, bu yüzden anlıyorlar.
ToolmakerSteve

Beşinci olarak, soru bağlamında, String.TrimEndkullanımı daha uygun olacaktır. Ama bekleyin, bu zaten var - ve orijinal soruda ve 3 yıl önce diğer birkaç cevapta bahsedildi - yeni bir yöntem icat etmeye gerek yok! Yaklaşımınızın faydası nedir?
ToolmakerSteve

7

Sondaki virgülleri kaldırır:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Bu geriye doğru olsa da, ilk etapta virgül ekleyen kodu yazdınız. Bunun string.Join(",",g)yerine, gbir string[]. gÇok daha iyi bir isim verin !


4

Her öğe için virgül eklemenin alternatifi olarak String.Join'i kullanabilirsiniz:

var strgroupids = String.Join(",",  groupIds);

Bu , dizideki her öğe arasına ayırıcı (",") ekler .


3
string strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    strgroupids = strgroupids + g.ToString() + ",";
});

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

Kullanımı geldiğini hatırlatırız ForEachburada normalde "yanlış" olarak kabul edilir (örneğin okuma http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Bazı LINQ kullanma:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

Uç alt dizeleme olmadan:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));

1
@KierenJohnstone string.Joinmükemmel kaynak dizeleri bir dizi varsa VEYA C # 4.0
xanatos

3

Sll'nin çözümüne ek olarak: Sonunda boş (lar) olması durumunda dizeyi kırpmak daha iyidir.

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);

2

string.Joindaha iyidir, ancak gerçekten bir LINQ istiyorsanız ForEach:

var strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    if(strgroupids != string.Empty){
        strgroupids += ",";
    }

    strgroupids += g;
});

Bazı notlar:

  • string.Joinve foreachikisi de bundan daha iyi, çok daha yavaş bir yaklaşım
  • Sonuncuyu kaldırmaya gerek yok ,Asla eklenmediğinden
  • Artış operatörü (+= ) dizelere eklemek için kullanışlıdır
  • .ToString() dize olmayanları birleştirirken otomatik olarak çağrıldığından gereksizdir
  • Büyük dizeleri StringBuilderkullanırken dizeleri birleştirmek yerine dikkate alınmalıdır

1
Hata - if testi ters olması gerekirif(strgroupids != string.Empty){
ToolmakerSteve

Ancak, sonunda "," istenmeden dizeyi oluşturmak için her birinin nasıl kullanılacağını gösteren bir yanıt eklediğiniz için teşekkür ederiz! Bir lambda yapmanın gerekli olmadığını ve ForEach; foreach (var g in groupIds) {tam olarak çalışıyor :)
ToolmakerSteve

n1 @ToolmakerSteve, LINQ hakkında o zaman aldığım
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.