2010-09-19 76 views
92

La construcción de una cadena de petición posterior de la siguiente manera,¿Cómo borrar el último carácter en una cadena en 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()); 
     } 
    } 

después de obtener como resultado paramstr, tengo que borrar el último carácter & en ella

Cómo borrar el último carácter de una cadenausando DO#?

+2

supongo que es mejor simplemente no añadirla en el primer lugar, pero por lo demás se puede tratar paramstr.Substring (0, paramstr.Length - 1) –

+0

En caso de que su prodID puede contener caracteres arbitrarios, especialmente '&', necesita asegurarse de que se escape correctamente, como por ejemplo la respuesta de @MarcGravell sí. –

Respuesta

75

acumulación con string.Join lugar:

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

string.Join realiza un separador ("&") y y matriz de cadenas (parameters), e inserta el separador entre cada elemento de la matriz.

+1

Vale la pena señalar que esto es útil si no desea tener un signo & al final de la cadena. – Ammar

+0

Sabía que esto era en Ruby, no tenía idea de que estaba en C# y soy un desarrollador de .net. Me siento tan avergonzado, lol –

+0

No puedo creer que esta haya sido la respuesta elegida ... la que está justo debajo de esto por @BrianRasmussen es mucho más simple. – FastTrack

13

yo no añadiría que, en primer lugar:

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

No diré nada sobre la legibilidad de este fragmento, pero esta es la forma en que lo haría. –

+2

También es barato y fácil acortar la longitud del StringBuilder en uno después de completar el ciclo. –

+0

+1 para la mejor respuesta específica de contexto –

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

Es una buena práctica usar un StringBuilder al concatenar una gran cantidad de cadenas y, a continuación, puede utilizar el método Remove para deshacerse de el personaje final.

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

También recordé que puedes usar 'paramBuilder.Length - 1' para eliminar el último caracter, también. –

237

Personalmente me gustaría ir con la sugerencia de Rob, pero si se desea eliminar una (o más) carácter (s) de arrastre específicas que puede utilizar TrimEnd. P.ej.

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

+1 por ser la respuesta más simple para el * * título de la pregunta * –

+13

Tenga en cuenta que TrimEnd eliminará todas las apariciones finales de ese carácter '&' ... así que si la cadena termina con '&&&', TrimEnd eliminará los 3 de esos '&', no solo el último. Eso puede o no ser lo que quiere el OP. –

+3

@DougS FWIW Hice el escritor "eliminar uno (o más)". –

7

Es mejor si usa 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); 
} 
+0

Te falta '.ToArray()' en tu declaración 'Join'. +1 sin embargo. Me ayudó. –

+1

@desaivv: No, estaba usando esta sobrecarga: 'cadena estática pública Únase a (separador de cadenas, valores de IEnumerable )', es nuevo en C# 4.0 :) –

+0

Ahh my bad. Todavía usando VS2008 con 3.0 –

15

Prueba esto:

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

¿Consideraría explicar su respuesta un poco, para que otros que vengan tengan una mejor idea de por qué lo sugirió? –

+1

[La respuesta] (http://stackoverflow.com/a/15201203/1497596) por @Altaf Patel usa el método hermano [String.Remove Method (Int32)] (http://msdn.microsoft.com/en- us/library/9ad138yc% 28v = vs.110% 29.aspx) que es posiblemente más sencillo en esta situación. Sin embargo, es bueno saber sobre [String.Remove Method (Int32, Int32)] (http://msdn.microsoft.com/en-us/library/d8d7z2kk%28v=vs.110%29.aspx) que ofrece el capacidad de recortar una subcadena de longitud arbitraria desde cualquier lugar dentro de la cadena de origen. – DavidRR

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

De [String.Remove Method (Int32)] (http://msdn.microsoft.com/en-us/library/9ad138yc%28v=vs.110%29.aspx): * "Devuelve una nueva cadena en la que todos los caracteres en la instancia actual, comenzando en una posición especificada y continuando hasta la última posición, se han eliminado. "* – DavidRR

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

Esto funciona para eliminar un carácter único a partir del final de una cadena. Pero si lo uso para eliminar, por ejemplo, caracteres, esto no funciona:

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

Como alternativa, he utilizado este enfoque en su lugar:

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

Usando [String.Remove Method (Int32, Int32)] (http://msdn.microsoft.com/en) -us/library/d8d7z2kk% 28v = vs.110% 29.aspx), para eliminar ** 4 ** caracteres del final de una cadena: 'result = source.Remove ((source.Length - 4), 4) ; '. – DavidRR

0

Añadir un StringBuilderextension 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; 
} 

a continuación, utilizar:

yourStringBuilder.RemoveLast(","); 
Cuestiones relacionadas