Wie lösche ich das letzte Zeichen in einer Zeichenfolge in C #?

94

Erstellen einer Zeichenfolge für eine Post-Anfrage auf folgende Weise:

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

nachdem ich bekomme resultierende paramstr, ich brauche letztes Zeichen löschen &drin

So löschen Sie das letzte Zeichen in a Zeichenfolge mit C #?

rem
quelle
2
Ich denke, es ist besser, es erst gar nicht hinzuzufügen, aber ansonsten können Sie paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius
Wenn Ihre prodID insbesondere beliebige Zeichen enthalten darf &, müssen Sie sicherstellen, dass sie ordnungsgemäß maskiert wird, wie dies beispielsweise bei der Antwort von @MarcGravell der Fall ist.
Eugene Beresovsky

Antworten:

75

baue es string.Joinstattdessen mit:

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

string.JoinNimmt einen Separator ( "&") und ein Array von Strings ( parameters) und fügt den Separator zwischen die einzelnen Elemente des Arrays ein.

Rob Fonseca-Ensor
quelle
1
Beachten Sie, dass dies hilfreich ist, wenn Sie kein & -Zeichen am Ende der Zeichenfolge haben möchten.
Ammar
Ich wusste, dass dies in Ruby war, hatte keine Ahnung, dass es in C # war und ich bin ein .net-Entwickler. Ich fühle mich so verlegen lol
Jack Marchetti
Ich kann nicht glauben, dass dies die gewählte Antwort war ... die direkt darunter von @BrianRasmussen ist so viel einfacher.
FastTrack
@FastTrack Es hat das Grundproblem gelöst, anstatt die Frage im Titel zu beantworten. Meine Beschwerde: Wenn Sie fließend sprechen, warum nicht einfach alles in einer Zeile erledigen?
Graham
241

Persönlich würde ich Robs Vorschlag folgen, aber wenn Sie ein (oder mehrere) bestimmte nachfolgende Zeichen entfernen möchten, können Sie diese verwenden TrimEnd. Z.B

paramstr = paramstr.TrimEnd('&');
Brian Rasmussen
quelle
15
Beachten Sie, dass TrimEnd alle nachfolgenden Vorkommen dieses Zeichens '&' entfernt. Wenn die Zeichenfolge also mit '&&&' endet, entfernt TrimEnd alle drei dieser '&', nicht nur das letzte. Das kann sein oder auch nicht, was das OP will.
Doug S
3
@DougS FWIW Ich habe geschrieben "einen (oder mehrere) entfernen".
Brian Rasmussen
+1 für eine einfache Lösung, die somit leicht als Komponente für andere Probleme verwendet werden kann. Ich suchte nach einer Lösung, um einen Pfad aus mehreren Teilen zu erstellen, um sicherzustellen, dass ich keine doppelten oder fehlenden Schrägstriche hatte. Die Kombination von TrimEnd und TrimStart mit dieser Technik stellt dies sicher.
Joeppie
1
@ Joeppie: Schlagen Sie die Verwendung vor Path.Combine, die alle Pfadtrennzeichen versteht. Am wenigsten verwenden, Trimwas auf einmal beginnt und endet.
Nigel Touch
@Nigel das Problem, das ich mit Path.Combine habe, ist, dass wenn das zweite Argument mit einem Schrägstrich beginnt, es als absoluter Pfad interpretiert wird und das Ergebnis der absolute Pfad ist; Ich bevorzuge es, Leute zu "retten", von denen aus ich meinen Code aufrufe. Guter Punkt auf der Trim, obwohl :)
Joeppie
22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}
Steve Townsend
quelle
15

Versuche dies:

paramstr.Remove((paramstr.Length-1),1);
Nelson T Joseph
quelle
2
Würden Sie in Betracht ziehen, Ihre Antwort ein wenig zu erklären, damit andere, die mitkommen, eine bessere Vorstellung davon haben, warum Sie sie vorgeschlagen haben?
Andrew Barber
1
Die Antwort von @Altaf Patel verwendet die Geschwistermethode String.Remove (Int32), die in dieser Situation wohl einfacher ist. Es ist jedoch gut, die String.Remove-Methode (Int32, Int32) zu kennen , mit der ein Teilstring beliebiger Länge von einer beliebigen Stelle innerhalb des Quellstrings abgeschnitten werden kann.
DavidRR
13

Ich würde es einfach gar nicht erst hinzufügen:

 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
quelle
Ich werde nichts über die Lesbarkeit dieses Snippets sagen, aber so würde ich es machen.
Matti Virkkunen
2
Es ist auch billig und einfach, die Länge des StringBuilder nach Abschluss der Schleife um eins zu verkürzen.
Matt Greer
+1, um es nicht hinzuzufügen, anstatt es zu entfernen, um einen StringBuilder anstelle von + = zu verwenden und um Anhänge zu verketten, anstatt zu verketten und anzuhängen. :)
Guffa
1
Das Problem bei dieser Lösung ist, dass der "if" -Operator "n" mal aufgerufen wird.
Magallanes
11
string str="This is test string.";
str=str.Remove(str.Length-1);
Altaf Patel
quelle
1
Aus der String.Remove-Methode (Int32) : "Gibt eine neue Zeichenfolge zurück, in der alle Zeichen in der aktuellen Instanz gelöscht wurden, beginnend an einer bestimmten Position und bis zur letzten Position."
DavidRR
7

Es ist besser, wenn Sie verwenden 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
quelle
Sie fehlen .ToArray()in Ihrer JoinAussage. +1 obwohl. Half mir.
Desaivv
1
@desaivv: Nein, ich habe diese Überladung verwendet : public static string Join<T>(string separator, IEnumerable<T> values), es ist neu in C # 4.0 :)
Cheng Chen
Ahh mein schlechtes. Ich benutze immer noch VS2008 mit 3.0
desaivv
5

Es wird empfohlen, a zu verwenden, StringBuilderwenn viele Zeichenfolgen verkettet werden. Anschließend können Sie die Methode Remove verwenden, um das endgültige Zeichen zu entfernen.

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
quelle
Ich habe mich auch daran erinnert, dass Sie damit auch paramBuilder.Length - 1das letzte Zeichen entfernen können .
Dan Diplo
1
paramstr.Remove((paramstr.Length-1),1);

Dies funktioniert, um ein einzelnes Zeichen vom Ende einer Zeichenfolge zu entfernen. Aber wenn ich damit beispielsweise 4 Zeichen entferne, funktioniert das nicht:

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

Als Alternative habe ich stattdessen diesen Ansatz verwendet:

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);
Uzair Zaman Sheikh
quelle
2
Verwenden der String.Remove-Methode (Int32, Int32) , um 4 Zeichen am Ende eines Strings zu entfernen : result = source.Remove((source.Length - 4), 4);.
DavidRR
0

Fügen Sie a hinzu 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;
}

dann benutze:

yourStringBuilder.RemoveLast(",");
nznoor
quelle