C # 'da bir dizedeki son karakter nasıl silinir?


94

Gönderi isteği için aşağıdaki şekilde bir dize oluşturmak,

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

sonuç aldıktan sonra paramstr, &içindeki son karakteri silmem gerekiyor

C # kullanarak bir dizedeki son karakter nasıl silinir ?


2
İlk etapta eklememek daha iyidir sanırım, aksi takdirde paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius

ProdID'nizin rastgele karakterler içermesine izin verilmesi durumunda, özellikle &@MarcGravell'in cevabı gibi, düzgün bir şekilde kaçtığından emin olmanız gerekir.
Evgeniy Berezovsky

Yanıtlar:


75

string.Joinbunun yerine şununla inşa edin :

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

string.Joinayırıcı ( "&") ve dizelerden oluşan bir dizi ( ) alır ve dizinin parametersher öğesi arasına ayırıcı ekler.


1
Dizenin sonunda bir & işareti olmasını istemiyorsanız bunun yararlı olduğunu belirtmek gerekir.
Ammar

Bunun Ruby'de olduğunu biliyordum, C #'da olduğunu bilmiyordum ve ben bir .net geliştiriciyim. Çok utanmış hissediyorum lol
Jack Marchetti

Bunun seçilen cevap olduğuna inanamıyorum ... @ BrianRasmussen'in hemen altındaki cevap çok daha basit.
FastTrack

@FastTrack Başlıktaki soruyu yanıtlamak yerine kök sorunu çözdü. Şikayetim: Akıcı konuşacaksanız, neden hepsini tek bir satırda yapmıyorsunuz?
Graham

241

Şahsen ben Rob'un önerisiyle giderdim, ancak bir (veya daha fazla) belirli sondaki karakteri / karakterleri kaldırmak isterseniz kullanabilirsiniz TrimEnd. Örneğin

paramstr = paramstr.TrimEnd('&');

15
TrimEnd'in o karakterin sondaki tüm oluşumlarını kaldıracağını unutmayın. '&' ... bu yüzden eğer dize '&&&' ile biterse TrimEnd sadece sonuncusu değil, '&' üçünün hepsini kaldıracaktır. OP'nin istediği bu olabilir veya olmayabilir.
Doug S

3
@DougS FWIW Yazar "birini (veya daha fazlasını) kaldır" yaptım.
Brian Rasmussen

Basit bir çözüm için +1, bu nedenle diğer problemler için bir bileşen olarak kolayca kullanılabilir. Birden fazla parçadan bir yol oluşturmak için bir çözüm arıyordum, çift veya eksik eğik çizgim olmadığından emin olmak için. TrimEnd ve TrimStart'ın bu teknikle birleştirilmesi bunu sağlar.
Joeppie

1
@Joeppie: Path.Combinetüm yol ayırıcılarını anlayan kullanmayı önerin . En azından Trimtek seferde başlayıp biten kullanın .
Nigel Dokunmatik

@Nigel, Path.Combine ile yaşadığım sorun, eğer ikinci argüman bir bölü çizgiyle başlıyorsa, mutlak bir yol olarak yorumlanması ve sonucun mutlak yol olmasıdır; bu, kodumu arayan insanları 'kurtarmayı' tercih ettiğim bir şey. Trim için iyi bir nokta olsa da :)
Joeppie

22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}

15

Bunu dene:

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

2
Karşınıza gelen diğerlerinin neden önerdiğinizi daha iyi anlayabilmesi için cevabınızı biraz açıklamayı düşünür müsünüz?
Andrew Barber

1
@Altaf Patel'in cevabı , bu durumda tartışmasız daha basit olan kardeş yöntemi String.Remove Method (Int32) kullanıyor . Bununla birlikte, kaynak dizenin herhangi bir yerinden rastgele uzunlukta bir alt dizeyi kırpma yeteneği sunan String.Remove Yöntemi (Int32, Int32) hakkında bilmek iyidir .
DavidRR

13

İlk başta eklemem:

 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();

Bu pasajın okunabilirliği hakkında hiçbir şey söylemeyeceğim, ancak bunu böyle yapacağım.
Matti Virkkunen

2
Döngü tamamlandıktan sonra StringBuilder'ın uzunluğunu bir kısaltmak da ucuz ve kolaydır.
Matt Greer

Bunu kaldırmak yerine eklememek, + = yerine bir StringBuilder kullanmak ve birleştirme ve ekleme yerine zincirleme eklemeler için +1. :)
Guffa

1
Bu çözümle ilgili sorun, "if" operatörünün "n" kez adlandırılmasıdır.
magallanes

11
string str="This is test string.";
str=str.Remove(str.Length-1);

1
From String.Remove Method (Int32) : "Belirtilen bir konumdan başlayıp son konuma kadar devam eden geçerli örnekteki tüm karakterlerin silindiği yeni bir dize döndürür."
DavidRR

7

Kullanırsan daha iyi 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);
 }

Sen eksik .ToArray()sizin de Joinaçıklamada. +1 olsa da. Bana yardımcı oldu.
Bir-Bir

1
@desaivv: Hayır, bu aşırı yüklemeyi kullanıyordum:, public static string Join<T>(string separator, IEnumerable<T> values)C # 4.0'da yeni :)
Cheng Chen

Ahh benim hatam. Hala 3.0 ile VS2008 kullanılıyor
One-One

5

Çok StringBuildersayıda dizeyi birleştirirken a kullanmak iyi bir uygulamadır ve ardından son karakterden kurtulmak için Kaldır yöntemini kullanabilirsiniz.

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();

paramBuilder.Length - 1Son karakteri de kaldırmak için kullanabileceğinizi de hatırladım .
Dan Diplo

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

Bu, bir dizenin sonundan tek bir karakteri kaldırmak için çalışır. Ancak, diyelim ki 4 karakteri kaldırmak için kullanırsam , bu işe yaramaz:

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

Alternatif olarak, bunun yerine bu yaklaşımı kullandım:

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);

2
Kullanılması String.Remove Yöntemi (Int32, Int32) , uzaklaştırmak için 4 bir dize sonundan karakterleri: result = source.Remove((source.Length - 4), 4);.
DavidRR

0

Bir 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;
}

sonra kullan:

yourStringBuilder.RemoveLast(",");
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.