2010-09-19 10 views
92

Aufbau einer Zeichenfolge für Post-Anforderung in der folgenden Art und Weise,Wie lösche ich das letzte Zeichen in einer Zeichenfolge in C#?

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 paramstr bekommen resultierende, ich brauche letzte Zeichen & darin

So löschen letzte Zeichen in einem Zeichenfolge löschen mit C#?

+2

Vermutung ist es besser, nur nicht an erster Stelle hinzufügen, aber ansonsten kann man versuchen paramstr.Substring (0, paramstr.Length - 1) –

+0

Wenn Ihr prodID darf beliebige Zeichen enthalten, insbesondere '&', Sie müssen sicherstellen, dass es richtig maskiert wird, wie zB Die Antwort von @MarcGravell tut es. –

Antwort

75

build mit string.Join statt:

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

string.Join nimmt einen Seperator ("&") und und das Array von Zeichenketten (parameters), und fügt den Seperator zwischen jedem Element des Arrays.

+1

Es lohnt sich zu beachten, dass dies hilfreich ist, wenn Sie nicht möchten, ein & Zeichen am Ende der Zeichenfolge zu haben. – Ammar

+0

Ich wusste, das war in Ruby, hatte keine Ahnung, dass es in C# war und ich bin ein .net dev. Ich fühle mich so peinlich lol –

+0

Ich kann nicht glauben, dass dies die gewählte Antwort war ... der eine direkt darunter von @BrianRasmussen ist so viel einfacher. – FastTrack

13

Ich würde einfach nicht fügen Sie es in erster Linie:

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

Ich werde nichts über die Lesbarkeit dieses Snippets sagen, aber so würde ich es machen. –

+2

Es ist auch billig und einfach, die StringBuilder Länge nur um eins zu verkürzen, nachdem die Schleife fertig ist. –

+0

+1 für die beste kontextspezifische Antwort –

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

Es ist gute Praxis ein StringBuilder zu verwenden, wenn eine Menge von Strings verketten und Sie können dann die Remove-Methode verwenden, um loszuwerden, das letzte Zeichen.

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

Ich erinnerte mich auch, dass Sie 'paramBuilder.Length - 1' verwenden können, um auch das letzte Zeichen zu entfernen. –

237

Persönlich würde ich mit Rob Vorschlag gehen, aber wenn Sie ein entfernen möchten (oder mehrere) spezifische Hinter Zeichen (s) Sie TrimEnd verwenden können. Z.B.

paramstr = paramstr.TrimEnd('&'); 
+44

+1 für die einfachste Antwort für die Frage * title * –

+13

Beachten Sie, dass TrimEnd alle nachfolgenden Vorkommen des Zeichens '&' entfernt. Wenn die Zeichenfolge also mit '&&&' endet, dann entfernt TrimEnd alle 3 davon '&', nicht nur der letzte. Das kann oder darf nicht das sein, was das OP will. –

+3

@DougS FWIW Ich habe den Schreiber "einen (oder mehrere) entfernen". –

7

Es ist besser, wenn Sie string.Join verwenden.

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); 
} 
+0

Sie vermissen '.ToArray()' in Ihrer 'Join' Anweisung. +1 obwohl. Half mir. –

+1

@desaivv: Nein, ich benutzte diese Überladung: 'public static string Join (Trennzeichen, IEnumerable Werte)', es ist neu in C# 4.0 :) –

+0

Ahh mein schlechtes. Immer noch mit VS2008 mit 3.0 –

15

Versuchen Sie folgendes:

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

Möchten Sie Ihre Antwort ein wenig erklären, so dass andere, die mitkommen, eine bessere Idee haben, warum Sie es vorgeschlagen haben? –

+1

[Die Antwort] (http://stackoverflow.com/a/15201203/1497596) von @Altaf Patel verwendet die Geschwistermethode [String.Remove-Methode (Int32)] (http://msdn.microsoft.com/de-de us/library/9ad138yc% 28v = vs.110% 29.aspx), die in dieser Situation wohl einfacher ist. Allerdings ist es gut, über [String.Remove-Methode (Int32, Int32)] (http://msdn.microsoft.com/en-us/library/d8d7z2kk%28v=vs.110%29.aspx) zu wissen, die die anbietet Fähigkeit, einen Teilstring beliebiger Länge von überall innerhalb des Quellstrings zu trimmen. – DavidRR

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

Aus [String.Remove-Methode (Int32)] (http://msdn.microsoft.com/en-us/library/9ad138yc%28v=vs.110%29.aspx): * "Gibt eine neue Zeichenfolge in dem alle zurück Die Zeichen in der aktuellen Instanz, angefangen bei einer angegebenen Position bis zur letzten Position, wurden gelöscht. "* – DavidRR

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

Das funktioniert ein einzelnes Zeichen aus dem Ende einer Zeichenfolge zu entfernen. Aber wenn ich es verwenden, um zu entfernen, sagen wir, Zeichen, das nicht funktioniert:

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

Als Alternative habe ich diesen Ansatz verwendet statt:

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

Verwenden von [String.Remove-Methode (Int32, Int32)] (http://msdn.microsoft.com/en -us/library/d8d7z2kk% 28v = vs.110% 29.aspx), um ** 4 ** Zeichen vom Ende eines Strings zu entfernen: 'result = source.Remove ((source.Length - 4), 4) ; '. – DavidRR

0

ein StringBuilder hinzufügen 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 verwenden:

yourStringBuilder.RemoveLast(","); 
Verwandte Themen