Hapus karakter terakhir

260

Saya mengambil banyak informasi dalam daftar, terhubung ke database dan saya ingin membuat serangkaian grup, untuk seseorang yang terhubung ke situs web.

Saya menggunakan ini untuk menguji tetapi ini tidak dinamis, jadi itu benar-benar buruk:

string strgroupids = "6";

Saya ingin menggunakan ini sekarang. Tetapi string yang dikembalikan adalah sesuatu seperti1,2,3,4,5,

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

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

Saya ingin menghapus ,setelah 5tapi pasti tidak berfungsi.

Kiwimoisi
sumber
9
Solusi untuk masalah langsung adalah strgroupids = strgroupids.TrimEnd(new char[] { ',' });tetapi ada ide yang lebih baik di bawah ini.
Henk Holterman

Jawaban:

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

MSDN:

String.Remove (Int32):

Menghapus semua karakter dari string ini dimulai dari posisi yang ditentukan dan melanjutkan melalui posisi terakhir

sll
sumber
1
Sempurna untuk menghapus karakter terakhir jika Anda ingin menghapus karakter terakhir. Untuk pertanyaan OP, masalahnya tidak akan ada jika Anda tidak membuat karakter tambahan. Periksa solusi @ Øyvind Bråthen jika Anda berada di kapal OP.
aloisdg pindah ke codidact.com
86

Bagaimana dengan melakukannya dengan cara ini

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

Sebuah banyak bersih.

Ini akan menambahkan semua elemen di dalamnya groupIdsdengan ','masing-masing, tetapi tidak akan menempatkan ','pada akhirnya.

Øyvind Bråthen
sumber
4
Hanya di C # 4.0. Di C # 3.5 Anda harus mengonversi groupIds ke array.
xanatos
3
Yang ini akan memperbaiki masalah OP.
aloisdg pindah ke codidact.com
29

String dalam c # tidak dapat diubah. Ketika dalam kode Anda Anda lakukan strgroupids.TrimEnd(',');atau strgroupids.TrimEnd(new char[] { ',' });yang strgroupidsstring yang tidak diubah .

Anda perlu melakukan sesuatu sebagai strgroupids = strgroupids.TrimEnd(',');gantinya.

Mengutip dari sini :

String tidak dapat diubah - konten objek string tidak dapat diubah setelah objek dibuat, meskipun sintaksnya membuatnya tampak seolah-olah Anda bisa melakukan ini. Misalnya, ketika Anda menulis kode ini, kompiler sebenarnya membuat objek string baru untuk menampung urutan karakter baru, dan objek baru tersebut ditugaskan untuk b. String "h" kemudian memenuhi syarat untuk pengumpulan sampah.

Andy Johnson
sumber
11

Tambahkan metode ekstensi.

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

lalu gunakan:

yourString.RemoveLast(",");
Tidak
sumber
Gagasan dasar membuat metode ekstensi itu bagus. Namun, IMHO, metode yang diterapkan di sini terlalu banyak, untuk penggunaan ini. OP tahu karakter yang diinginkannya ada di akhir string, jadi tidak ada alasan untuk mengeluarkan biaya mencari string itu, melalui LastIndexOf. Ambil saja jawaban yang diterima, dan jadikan sebagai metode ekstensi. Atau menggeneralisasi jawaban itu, dengan int nmemasukkan, jumlah karakter untuk dihapus di akhir. Kedua, Anda menguji dengan panjang nol, tetapi itu tidak menghilangkan semua pengecualian yang mungkin. Akan lebih baik untuk dilakukan int index = ..LastIndexOf.., kalau begitu if (index >= 0).
ToolmakerSteve
Ketiga, parameternya string charactertidak bernama. Keempat, tidak jelas bagi programmer masa depan bahwa ini adalah menghapus karakter di akhir string. Oh, tunggu, belum tentu demikian. Sedang mencari string. Bisa saja menghapus dari suatu tempat di tengah. Sekarang programmer pemeliharaan harus memeriksa semua penggunaan metode ini, untuk melihat apa yang ingin dicapai. Bukan metode yang baik untuk menelepon, untuk kebutuhan sederhana ini menghapus dari ujung sebuah string. Maaf atas semua kritiknya; Saya melakukannya untuk siapa saja yang mengadopsi metode ini, jadi mereka mengerti.
ToolmakerSteve
Kelima, dalam konteks pertanyaan, String.TrimEndakan lebih tepat untuk digunakan. Tapi tunggu, itu sudah ada - dan disebutkan dalam pertanyaan asli dan beberapa jawaban lain 3 tahun yang lalu - tidak perlu menemukan metode baru! Apa manfaat dari pendekatan Anda?
ToolmakerSteve
7

Menghapus koma tertinggal:

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

Ini mundur meskipun, Anda menulis kode yang menambahkan koma di tempat pertama. Anda harus menggunakan string.Join(",",g)sebagai gantinya, dengan anggapan ga string[]. Beri nama yang lebih baik daripada gjuga!

Kieren Johnstone
sumber
4

Sebagai pengganti menambahkan koma untuk setiap item, Anda bisa menggunakan String.Gabung:

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

Ini akan menambahkan pemisah ("," dalam contoh ini) antara setiap elemen dalam array.

Gary
sumber
3
string strgroupids = string.Empty;

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

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

Perhatikan bahwa penggunaan di ForEachsini biasanya dianggap "salah" (baca misalnya http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Menggunakan beberapa LINQ:

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

Tanpa pengakhiran akhir:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));
xanatos
sumber
1
@KierenJohnstone string.Joinsempurna JIKA Anda memiliki serangkaian string sebagai sumber ATAU Anda memiliki C # 4.0
xanatos
3

Tambahan untuk solusi sll: Lebih baik untuk memotong string jika ada beberapa kosong di akhir.

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);
penyamakan kulit
sumber
2

string.Joinlebih baik, tetapi jika Anda benar - benar menginginkan LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Beberapa catatan:

  • string.Join dan foreach keduanya lebih baik dari ini, pendekatan yang jauh lebih lambat
  • Tidak perlu menghapus yang terakhir , karena tidak pernah ditambahkan
  • Operator kenaikan (+= ) berguna untuk menambahkan string
  • .ToString() tidak perlu karena disebut secara otomatis ketika menggabungkan non-string
  • Saat menangani string besar, StringBuilderharus dipertimbangkan alih-alih string gabungan

sumber
1
BUG - perlu membalikkan tes if - seharusnyaif(strgroupids != string.Empty){
ToolmakerSteve
Tetapi terima kasih telah menambahkan jawaban yang menunjukkan cara menggunakan untuk-masing-masing untuk membangun string tanpa "," pada akhirnya! Perhatikan bahwa tidak perlu membuat lambda dan ForEach; foreach (var g in groupIds) {berfungsi dengan baik :)
ToolmakerSteve
n1 @ToolmakerSteve, tentang LINQ maka kode