Bagaimana cara menghapus karakter terakhir dalam string di C #?

94

Membangun string untuk permintaan posting dengan cara berikut,

  var itemsToAdd = sl.SelProds.ToList();
  if (sl.SelProds.Count() != 0)
  {
      foreach (var item in itemsToAdd)
      {
        paramstr = paramstr + string.Format("productID={0}&", item.prodID.ToString());
      }
  }

setelah saya mendapatkan hasil paramstr, saya perlu menghapus karakter terakhir &di dalamnya

Bagaimana cara menghapus karakter terakhir dalam string menggunakan C #?

rem
sumber
2
Kira lebih baik tidak menambahkannya terlebih dahulu, tetapi jika tidak, Anda dapat mencoba paramstr. Substring (0, paramstr.Length - 1)
Jaco Pretorius
Jika prodID Anda diizinkan berisi karakter arbitrer, terutama &, Anda perlu memastikannya lolos dengan benar, seperti misalnya jawaban @MarcGravell.
Evgeniy Berezovsky

Jawaban:

75

bangun dengan string.Join:

var parameters = sl.SelProds.Select(x=>"productID="+x.prodID).ToArray();
paramstr = string.Join("&", parameters);

string.Joinmengambil seperator ( "&") dan dan larik string ( parameters), dan menyisipkan pemisah antara setiap elemen larik.

Rob Fonseca-Ensor
sumber
1
Perlu dicatat bahwa ini berguna jika Anda tidak ingin memiliki & tanda di akhir string.
Ammar
Saya tahu ini di Ruby, tidak tahu itu di C # dan saya seorang .net dev. Saya merasa sangat malu lol
Jack Marchetti
Saya tidak percaya ini adalah jawaban yang dipilih ... yang tepat di bawah ini oleh @BrianRasmussen jauh lebih sederhana.
FastTrack
@FastTrack Ini memecahkan akar masalah, versus menjawab pertanyaan di judul. Keluhan saya: kalau mau fasih, kenapa tidak lakukan semuanya dalam satu baris.
Graham
241

Secara pribadi saya akan mengikuti saran Rob, tetapi jika Anda ingin menghapus satu (atau lebih) karakter trailing tertentu yang dapat Anda gunakan TrimEnd. Misalnya

paramstr = paramstr.TrimEnd('&');
Brian Rasmussen
sumber
15
Ketahuilah bahwa TrimEnd akan menghapus semua kemunculan karakter '&' ... jadi jika string diakhiri dengan '&&&' maka TrimEnd akan menghapus semua 3 dari '&' itu, bukan hanya yang terakhir. Itu mungkin atau mungkin tidak yang diinginkan OP.
Doug S
3
@DougS FWIW Saya melakukan penulis "menghapus satu (atau lebih)".
Brian Rasmussen
+1 untuk solusi sederhana, yang dapat dengan mudah digunakan sebagai komponen untuk masalah lain. Saya sedang mencari solusi untuk membuat jalur dari beberapa bagian memastikan saya tidak memiliki garis miring ganda atau hilang. Menggabungkan TrimEnd dan TrimStart dengan teknik ini memastikannya.
Joeppie
1
@Joeppie: menyarankan penggunaan Path.Combine, yang memahami semua pemisah jalur. Paling tidak gunakan Trimyang dimulai dan diakhiri dalam sekali jalan.
Nigel Touch
@Nigel Masalah yang saya hadapi dengan Path.Combine adalah jika argumen kedua dimulai dengan garis miring, itu ditafsirkan sebagai jalur absolut, dan hasilnya adalah jalur absolut; ini adalah sesuatu yang saya lebih suka untuk 'menyimpan' orang yang memanggil kode saya. Poin yang bagus tentang Trim, meskipun :)
Joeppie
22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}
Steve Townsend
sumber
15

Coba ini:

paramstr.Remove((paramstr.Length-1),1);
Nelson T Joseph
sumber
2
Apakah Anda akan mempertimbangkan untuk menjelaskan jawaban Anda sedikit, sehingga orang lain yang datang memiliki gambaran yang lebih baik mengapa Anda menyarankannya?
Andrew Barber
1
Jawaban oleh @Altaf Patel menggunakan metode saudara String.Remove Method (Int32) yang bisa dibilang lebih lugas dalam situasi ini. Namun, ada baiknya mengetahui tentang Metode String.Remove (Int32, Int32) yang menawarkan kemampuan untuk memangkas substring dengan panjang arbitrer dari mana saja dalam string sumber.
DavidRR
13

Saya tidak akan menambahkannya sejak awal:

 var sb = new StringBuilder();

 bool first = true;
 foreach (var foo in items) {
    if (first)
        first = false;
    else
        sb.Append('&');

    // for example:
    var escapedValue = System.Web.HttpUtility.UrlEncode(foo);

    sb.Append(key).Append('=').Append(escapedValue);
 }

 var s = sb.ToString();
Marc Gravell
sumber
Saya tidak akan mengatakan apa-apa tentang keterbacaan cuplikan ini, tetapi inilah cara saya melakukannya.
Matti Virkkunen
2
Ini juga murah dan mudah untuk mempersingkat panjang StringBuilder satu setelah perulangan selesai.
Matt Greer
+1 untuk tidak menambahkannya alih-alih menghapusnya, untuk menggunakan StringBuilder alih-alih + =, dan untuk merangkai menambahkan alih-alih menggabungkan dan menambahkan. :)
Guffa
1
Masalah dengan solusi ini adalah bahwa operator "jika" dipanggil "n" kali.
magallanes
11
string str="This is test string.";
str=str.Remove(str.Length-1);
Altaf Patel
sumber
1
Dari Metode String.Remove (Int32) : "Mengembalikan string baru di mana semua karakter dalam contoh saat ini, dimulai dari posisi tertentu dan berlanjut hingga posisi terakhir, telah dihapus."
DavidRR
7

Lebih baik jika Anda menggunakan string.Join.

 class Product
 {
   public int ProductID { get; set; }
 }
 static void Main(string[] args)
 {
   List<Product> products = new List<Product>()
      {   
         new Product { ProductID = 1 },
         new Product { ProductID = 2 },
         new Product { ProductID = 3 }
      };
   string theURL = string.Join("&", products.Select(p => string.Format("productID={0}", p.ProductID)));
   Console.WriteLine(theURL);
 }
Cheng Chen
sumber
Anda hilang .ToArray()dalam Joinpernyataan Anda . +1 sekalipun. Membantuku.
desaivv
1
@desaivv: Tidak, saya menggunakan kelebihan ini:, public static string Join<T>(string separator, IEnumerable<T> values)ini baru di C # 4.0 :)
Cheng Chen
Ahh saya buruk. Masih menggunakan VS2008 dengan 3.0
desaivv
5

Ini praktik yang baik untuk menggunakan a StringBuildersaat menggabungkan banyak string dan Anda kemudian dapat menggunakan metode Hapus untuk menyingkirkan karakter terakhir.

StringBuilder paramBuilder = new StringBuilder();

foreach (var item in itemsToAdd)
{
    paramBuilder.AppendFormat(("productID={0}&", item.prodID.ToString());
}

if (paramBuilder.Length > 1)
    paramBuilder.Remove(paramBuilder.Length-1, 1);

string s = paramBuilder.ToString();
Dan Diplo
sumber
Saya juga ingat Anda bisa menggunakan paramBuilder.Length - 1untuk menghapus karakter terakhir juga.
Dan Diplo
1
paramstr.Remove((paramstr.Length-1),1);

Ini berfungsi untuk menghapus satu karakter dari ujung string. Tetapi jika saya menggunakannya untuk menghapus, katakanlah, 4 karakter, ini tidak berfungsi:

paramstr.Remove((paramstr.Length-4),1);

Sebagai alternatif, saya telah menggunakan pendekatan ini sebagai gantinya:

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);
Uzair Zaman Sheikh
sumber
2
Menggunakan String.Remove Method (Int32, Int32) , untuk menghapus 4 karakter dari akhir string: result = source.Remove((source.Length - 4), 4);.
DavidRR
0

Tambahkan StringBuilder extension method.

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

lalu gunakan:

yourStringBuilder.RemoveLast(",");
nznoor.dll
sumber