文字列の最後の文字を削除


259

データベースにリンクされたリストの多くの情報を取得しています。Webサイトに接続している人のために、一連のグループを作成します。

私はこれをテストに使用していますが、これは動的ではないため、本当に悪いです:

string strgroupids = "6";

これを今使いたいです。しかし、返される文字列は次のようなものです1,2,3,4,5,

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

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

,後を削除したいのです5が、確実に機能しません。


9
直接的な問題の解決策はstrgroupids = strgroupids.TrimEnd(new char[] { ',' });次のとおりですが、以下により良いアイデアがあります。
Henk Holterman、2011年

回答:


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

MSDN:

String.Remove(Int32):

この文字列から、指定された位置から最後の位置まですべての文字を削除します


1
最後の文字を削除したい場合は、最後の文字を削除するのに最適です。OPの質問では、末尾のcharを作成しない場合、問題は存在しないはずです。OPのボートに乗っている場合は、@ØyvindBråthenソリューションを確認してください。
aloisdgがcodidact.comに移動

86

このようにするのはどうですか

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

ロットクリーナー。

内部にすべての要素をそれぞれgroupIds','間で追加しますが','、最後にa を置きません。


4
C#4.0のみ。C#3.5では、groupIdsを配列に変換する必要があります。
xanatos

3
これはOPの問題を修正します。
aloisdgがcodidact.comに移動

29

C#の文字列は不変です。あなたのコードで、あなたが行うとstrgroupids.TrimEnd(',');か、文字列は変更されませんstrgroupids.TrimEnd(new char[] { ',' });strgroupids

strgroupids = strgroupids.TrimEnd(',');代わりに何かをする必要があります。

ここから引用するに

文字列は不変です。文字列オブジェクトの内容は、オブジェクトが作成された後は変更できませんが、構文により、これを実行できるかのように表示されます。たとえば、このコードを作成すると、コンパイラは実際に新しい文字列オブジェクトを作成して新しい文字シーケンスを保持し、その新しいオブジェクトがbに割り当てられます。文字列 "h"はガベージコレクションの対象になります。


11

拡張メソッドを追加します。

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

次に使用します:

yourString.RemoveLast(",");

拡張メソッドを作成する基本的な考え方は良いです。ただし、私見、ここで実装された方法は、この使用法では過剰です。OPは、希望する文字が文字列の最後にあることを知っていたため、LastIndexOfを介してその文字列を検索する費用がかかる理由はありませんでした。受け入れられた答えを受け取り、それを拡張メソッドにします。またはint n、最後に削除する文字数をに渡して、その回答を一般化します。次に、長さがゼロかどうかをテストしますが、すべての例外が排除されるわけではありません。int index = ..LastIndexOf..その後、行う方が良いでしょうif (index >= 0)
ToolmakerSteve 2016

3番目に、パラメーターのstring character名前が不適切です。第4に、これが文字列の最後の文字削除することは、将来のプログラマにとってすぐにはわかりません。ええと、必ずしもそうではありません。文字列を検索しています。それは途中のどこかから削除されている可能性があります。ここで、メンテナンスプログラマは、メソッドのすべての使用を調べて、何が達成されようとしていたかを確認する必要があります。文字列の末尾から削除するというこの単純な必要性のため、呼び出すのに適したメソッドではありません。すべての批判のため申し訳ありません。私はこの方法を採用している人のためにそうしていますので、彼らは理解しています。
ToolmakerSteve 2016

第五に、質問の文脈では、String.TrimEnd使用するのがより適切でしょう。しかし、待ってください。それはすでに存在しており、3年前の元の質問と他のいくつかの回答で言及されていました。新しい方法を発明する必要はありません。あなたのアプローチの利点は何ですか?
ToolmakerSteve 2016

7

末尾のカンマを削除します。

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

これは逆ですが、最初にコンマを追加するコードを記述しました。string.Join(",",g)をと仮定しgて、代わりに使用する必要がありstring[]ます。それよりgも良い名前を付けてください!


4

各アイテムにカンマを追加する代わりに、String.Joinを使用することもできます。

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

これにより、配列の各要素の間にセパレーター(この例では "、")が追加されます。


3
string strgroupids = string.Empty;

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

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

ここでの使用ForEachは通常「間違っている」と見なされていることに注意してください(たとえばhttp://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspxをお読みください)

LINQを使用する:

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

終了部分文字列なし:

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

1
@KierenJohnstone string.Joinは、ソースとして文字列の配列がある場合、またはC#4.0がある場合に最適です
xanatos

3

sllのソリューションへの追加:最後に空白がある場合は、文字列をトリミングすることをお勧めします。

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

2

string.Joinより良いですが、本当に LINQ が必要な場合ForEach

var strgroupids = string.Empty;

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

    strgroupids += g;
});

いくつかのメモ:

  • string.Joinそしてforeach、非常に遅く、両方のアプローチこれよりも優れています
  • ,追加されることがないため、最後を削除する必要はありません
  • インクリメント演算子(+=)は文字列への追加に便利です
  • .ToString() 非文字列を連結するときに自動的に呼び出されるため不要です
  • 大きな文字列を処理する場合StringBuilderは、文字列を連結する代わりに検討する必要があります

1
BUG -する必要があります-テストがあれば逆にする必要性if(strgroupids != string.Empty){
ToolmakerSteve

しかし、for-eachを使用して、不要な「、」を最後に付けずに文字列を作成する方法を示す回答を追加していただき、ありがとうございます。ラムダとを作成する必要はありませんForEachforeach (var g in groupIds) {同様に動作します:)
ToolmakerSteve

n1 @ ToolmakerSteve、LINQについては、私が取ったOPコード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.