C#で文字列の最後の文字を削除する方法は?


94

次の方法で投稿リクエストの文字列を作成します、

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

結果が出たらparamstr、最後の文字を削除する必要があり&ます

C#を使用して文字列の最後の文字を削除するにはどうすればよいですか?


2
そもそも追加しない方が良いと思いますが、それ以外の場合はparamstr.Substring(0、paramstr.Length-1)を試すことができます
Jaco Pretorius

prodIDに任意の文字、特にを含めることが許可されている場合は、@ MarcGravell &の回答のように、適切にエスケープされるようにする必要があります。
Eugene Beresovsky

回答:


75

string.Join代わりにそれを構築する:

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

string.Join区切り"&"文字(parameters)と文字列の配列()を受け取り、配列の各要素の間に区切り文字を挿入します。


1
文字列の最後に&記号を付けたくない場合に便利です。
Ammar

私はこれがRubyであることを知っていて、それがC#にあることを知りませんでした。私はとても恥ずかしい笑
ジャックマルケッティ2013

これが選ばれた答えであるとは信じられません... @BrianRasmussenによるこのすぐ下の答えは、はるかに単純です。
FastTrack

@FastTrackタイトルの質問に答えるのではなく、根本的な問題を解決しました。私の不満:あなたが流暢になるつもりなら、なぜそれをすべて一行でやらないのですか?
グラハム

241

個人的にはロブの提案に従いますが、1つ(または複数)の特定の末尾の文字を削除する場合は、を使用できますTrimEnd。例えば

paramstr = paramstr.TrimEnd('&');

15
TrimEndはその文字「&」の後続の出現をすべて削除することに注意してください。したがって、文字列が「&&&」で終わる場合、TrimEndは最後の1つだけでなく3つすべての「&」を削除します。それはOPが望んでいることかもしれませんし、そうでないかもしれません。
Doug S 14

3
@DougS FWIW筆者は「1つ(または複数)を削除」しました。
ブライアンラスムッセン

+1は単純なソリューションで、他の問題のコンポーネントとして簡単に使用できます。複数のパーツからパスを作成するソリューションを探していましたが、二重のスラッシュやスラッシュが欠落していないことを確認しました。TrimEndとTrimStartをこの手法と組み合わせると、これが保証されます。
Joeppie 2014年

1
@Joeppie:Path.Combineすべてのパス区切り文字を理解するの使用を提案します。Trim開始と終了が一度に行われるLeastwaysの使用。
Nigel Touch

@Nigel Path.Combineで私が抱えている問題は、2番目の引数がスラッシュで始まる場合、それが絶対パスとして解釈され、結果が絶対パスになることです。これは、私のコードを呼び出す人を「節約」するために私が好むものです。しかし、トリムの良い点:)
Joeppie


15

これを試して:

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

2
あなたの答えを少し説明して、一緒に来た人があなたがそれを提案した理由をよりよく理解できるようにしますか?
Andrew Barber

1
@Altaf Patel の答えは兄弟メソッドString.Removeメソッド(Int32)を使用していますが、この状況では間違いなくより簡単です。ただし、ソース文字列内の任意の場所から任意の長さの部分文字列をトリミングする機能を提供するString.Removeメソッド(Int32、Int32)について知っておくと便利です。
DavidRR 2014年

13

私はそもそもそれを追加しません:

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

このスニペットの読みやすさについては何も言いませんが、これは私が行う方法です。
Matti Virkkunen、2010

2
また、ループが完了した後にStringBuilderの長さを1だけ短くするのも安価で簡単です。
マットグリア

+1は、削除せずに追加しない場合、+ =の代わりにStringBuilderを使用する場合、および連結と追加の代わりに追加をチェーンする場合。:)
Guffa

1
このソリューションの問題は、「if」演算子が「n」回呼び出されることです。
magallanes 2012


7

を使用した方がよいでしょう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);
 }

あなたは.ToArray()あなたのJoin声明に欠けています。+1。助けて頂きました。
desaivv 2012年

1
@desaivv:いいえ、私はこのオーバーロードを使用していました:public static string Join<T>(string separator, IEnumerable<T> values)、C#4.0の新機能です:)
Cheng Chen

ああ、私の悪い。3.0でのVS2008の使用
desaivv

5

StringBuilder多くの文字列を連結する場合はaを使用することをお勧めします。その後、Removeメソッドを使用して最後の文字を削除できます。

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 - 1最後のキャラクターを削除するのにも使えることを思い出しました。
Dan Diplo、2011年

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

これは、文字列の末尾から1文字を削除するために機能します。しかし、たとえば4文字を削除するために使用すると、これは機能しません。

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

代わりに、代わりにこのアプローチを使用しました。

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

2
String.Removeメソッド(Int32、Int32)を使用して、文字列の末尾から4文字を削除しますresult = source.Remove((source.Length - 4), 4);
DavidRR 2014年

0

を追加し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;
}

次に使用します:

yourStringBuilder.RemoveLast(",");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.