Löschen Sie das letzte Zeichen der Zeichenfolge


259

Ich rufe viele Informationen in einer Liste ab, die mit einer Datenbank verknüpft ist, und möchte eine Reihe von Gruppen für jemanden erstellen, der mit der Website verbunden ist.

Ich benutze dies zum Testen, aber das ist nicht dynamisch, also ist es wirklich schlecht:

string strgroupids = "6";

Ich möchte das jetzt nutzen. Aber die zurückgegebene Zeichenfolge ist so etwas wie1,2,3,4,5,

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

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

Ich möchte das ,nach dem löschen, 5aber es funktioniert definitiv nicht.


9
Die Lösung für das direkte Problem ist, strgroupids = strgroupids.TrimEnd(new char[] { ',' });aber es gibt unten bessere Ideen.
Henk Holterman

Antworten:


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

MSDN:

String.Remove (Int32):

Löscht alle Zeichen aus dieser Zeichenfolge, beginnend an einer bestimmten Position und bis zur letzten Position


1
Perfekt, um das letzte Zeichen zu entfernen, wenn Sie das letzte Zeichen entfernen möchten. Bei der Frage von OP sollte das Problem nicht bestehen, wenn Sie kein nachfolgendes Zeichen erstellen. Überprüfen Sie die @ Øyvind Bråthen-Lösung, wenn Sie sich im Boot von OP befinden.
Aloisdg zieht zu codidact.com

86

Was ist damit?

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

Ein viel sauberer.

Es werden alle Elemente im Inneren groupIdsmit einem ','Zwischenzeichen versehen, aber es wird kein ','am Ende gesetzt.


4
Nur in C # 4.0. In C # 3.5 müssen Sie groupIds in ein Array konvertieren.
Xanatos

3
Dieser wird das OP-Problem beheben.
Aloisdg zieht zu codidact.com

29

Zeichenfolgen in c # sind unveränderlich. Wenn Sie dies in Ihrem Code tun strgroupids.TrimEnd(',');oder strgroupids.TrimEnd(new char[] { ',' });die strgroupidsZeichenfolge nicht geändert wird .

Sie müssen strgroupids = strgroupids.TrimEnd(',');stattdessen so etwas tun .

Um von hier aus zu zitieren :

Zeichenfolgen sind unveränderlich - Der Inhalt eines Zeichenfolgenobjekts kann nach dem Erstellen des Objekts nicht mehr geändert werden, obwohl die Syntax den Anschein erweckt, als könnten Sie dies tun. Wenn Sie beispielsweise diesen Code schreiben, erstellt der Compiler tatsächlich ein neues Zeichenfolgenobjekt, das die neue Zeichenfolge enthält, und dieses neue Objekt wird b zugewiesen. Die Zeichenfolge "h" ist dann für die Speicherbereinigung berechtigt.


11

Fügen Sie eine Erweiterungsmethode hinzu.

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

dann benutze:

yourString.RemoveLast(",");

Die Grundidee zum Erstellen einer Erweiterungsmethode ist gut. IMHO ist die hier implementierte Methode für diese Verwendung jedoch übertrieben. OP wusste, dass sich das gewünschte Zeichen am Ende der Zeichenfolge befand, daher gab es keinen Grund, die Kosten für die Suche nach dieser Zeichenfolge über LastIndexOf zu tragen. Nehmen Sie einfach die akzeptierte Antwort und machen Sie sie zu einer Erweiterungsmethode. Oder verallgemeinern Sie diese Antwort, indem Sie int ndie Anzahl der Zeichen eingeben, die am Ende entfernt werden sollen. Zweitens testen Sie auf die Länge Null, aber das beseitigt nicht alle möglichen Ausnahmen. int index = ..LastIndexOf..Dann wäre es besser if (index >= 0).
ToolmakerSteve

Drittens ist der Parameter string characterschlecht benannt. Viertens ist es für zukünftige Programmierer nicht sofort offensichtlich, dass dadurch Zeichen am Ende der Zeichenfolge entfernt werden. Oh warte, das muss nicht unbedingt so sein. Es sucht die Zeichenfolge. Es könnte irgendwo in der Mitte entfernt werden. Jetzt muss der Wartungsprogrammierer alle Verwendungen der Methode untersuchen, um festzustellen, was erreicht werden soll. Keine gute Methode zum Aufrufen, da diese einfache Notwendigkeit besteht, sie vom Ende einer Zeichenfolge zu entfernen. Entschuldigung für die Kritik; Ich mache das für jeden, der diese Methode anwendet, damit sie verstehen.
ToolmakerSteve

Fünftens wäre im Zusammenhang mit der Frage String.TrimEnddie Verwendung angemessener. Aber warten Sie, das gibt es bereits - und es wurde in der ursprünglichen Frage und einigen anderen Antworten vor 3 Jahren erwähnt - keine Notwendigkeit, eine neue Methode zu erfinden! Was ist der Vorteil Ihres Ansatzes?
ToolmakerSteve

7

Entfernt nachfolgende Kommas:

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

Dies ist jedoch rückwärts, Sie haben den Code geschrieben, der das Komma an erster Stelle hinzufügt. Sie sollten string.Join(",",g)stattdessen verwenden, vorausgesetzt, es gist a string[]. Gib ihm einen besseren Namen als gauch!


4

Alternativ zum Hinzufügen eines Kommas für jedes Element können Sie auch String.Join verwenden:

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

Dadurch wird der Trennzeichen (in diesem Fall ",") zwischen jedem Element im Array hinzugefügt .


3
string strgroupids = string.Empty;

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

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

Beachten Sie, dass die Verwendung von ForEachhier normalerweise als "falsch" angesehen wird (lesen Sie beispielsweise http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx ).

Verwenden von etwas LINQ:

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

Ohne End-Teilzeichenfolge:

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

1
@KierenJohnstone string.Joinist perfekt, wenn Sie eine Reihe von Zeichenfolgen als Quelle haben ODER Sie haben C # 4.0
xanatos

3

Zusätzlich zur Lösung von sll: Es ist besser, die Zeichenfolge zu kürzen, falls am Ende Leerzeichen vorhanden sind.

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

2

string.Joinist besser, aber wenn Sie wirklich einen LINQ wollen ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Einige Notizen:

  • string.Joinund foreachbeide sind besser als dieser, weitaus langsamere Ansatz
  • Das letzte muss nicht entfernt werden, ,da es nie angehängt wird
  • Der Inkrement-Operator ( +=) ist praktisch zum Anhängen an Zeichenfolgen
  • .ToString() ist nicht erforderlich, da es beim Verketten von Nicht-Strings automatisch aufgerufen wird
  • Beim Umgang mit großen Zeichenfolgen StringBuildersollte berücksichtigt werden, anstatt Zeichenfolgen zu verketten

1
BUG - muss den if-Test umkehren - sollte seinif(strgroupids != string.Empty){
ToolmakerSteve

Aber danke, dass Sie eine Antwort hinzugefügt haben, die zeigt, wie Sie mit jedem die Zeichenfolge ohne das unerwünschte "," am Ende erstellen können! Beachten Sie, dass es nicht notwendig ist, ein Lambda zu machen und ForEach; foreach (var g in groupIds) {funktioniert genauso gut :)
ToolmakerSteve

n1 @ToolmakerSteve, über den LINQ, dann ist es der OP-Code, den ich genommen habe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.