¿Cómo eliminar el último carácter de una cadena en C #?

94

Construyendo una cadena para la solicitud de publicación de la siguiente manera,

  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 el resultado paramstr, necesito eliminar el último carácter &en él

¿Cómo eliminar el último carácter de una cadena usando C #?

movimiento rápido del ojo
fuente
2
Supongo que es mejor no agregarlo en primer lugar, pero de lo contrario, puede probar paramstr.Substring (0, paramstr.Length - 1)
Jaco Pretorius
En caso de que su prodID pueda contener caracteres arbitrarios, especialmente &, debe asegurarse de que se escape correctamente, como, por ejemplo, la respuesta de @MarcGravell.
Eugene Beresovsky

Respuestas:

75

construirlo con en su string.Joinlugar:

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

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

Rob Fonseca-Ensor
fuente
1
Vale la pena señalar que esto es útil si no desea tener un signo & al final de la cadena.
Ammar
Sabía que esto estaba en Ruby, no tenía idea de que estaba en C # y soy un desarrollador de .net. Me siento tan avergonzado lol
Jack Marchetti
No puedo creer que esta fuera la respuesta elegida ... la que está justo debajo de esta por @BrianRasmussen es mucho más simple.
FastTrack
@FastTrack Resolvió el problema de raíz, en lugar de responder a la pregunta del título. Mi queja: si vas a hablar con fluidez, ¿por qué no hacerlo todo en una sola línea?
Graham
241

Personalmente, iría con la sugerencia de Rob, pero si desea eliminar uno (o más) caracteres finales específicos, puede usar TrimEnd. P.ej

paramstr = paramstr.TrimEnd('&');
Brian Rasmussen
fuente
15
Tenga en cuenta que TrimEnd eliminará todas las apariciones finales de ese carácter '&' ... así que si la cadena termina con '&&&', entonces TrimEnd eliminará los 3 de esos '&', no solo el último. Eso puede ser o no lo que quiere el OP.
Doug S
3
@DougS FWIW Yo escribí "eliminar uno (o más)".
Brian Rasmussen
+1 para una solución sencilla que, por tanto, puede utilizarse fácilmente como componente para otros problemas. Estaba buscando una solución para crear una ruta a partir de varias partes, asegurándome de que no tuviera barras dobles o faltantes. La combinación de TrimEnd y TrimStart con esta técnica garantiza esto.
Joeppie
1
@Joeppie: sugiere usar Path.Combine, que comprende todos los separadores de ruta. Al menos, use el Trimque comienza y termina de una vez.
Nigel Touch
@Nigel, el problema que tengo con Path.Combine es que si el segundo argumento comienza con una barra, se interpreta como una ruta absoluta, y el resultado es la ruta absoluta; esto es algo de lo que prefiero 'salvar' a las personas que llaman a mi código. Buen punto en el Trim, sin embargo :)
Joeppie
22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}
Steve Townsend
fuente
15

Prueba esto:

paramstr.Remove((paramstr.Length-1),1);
Nelson T Joseph
fuente
2
¿Consideraría explicar un poco su respuesta, para que otros que vengan tengan una mejor idea de por qué la sugirió?
Andrew Barber
1
La respuesta de @Altaf Patel utiliza el método hermano String.Remove Method (Int32), que posiblemente sea más sencillo en esta situación. Sin embargo, es bueno saber sobre el método String.Remove (Int32, Int32) que ofrece la capacidad de recortar una subcadena de longitud arbitraria desde cualquier lugar dentro de la cadena de origen.
DavidRR
13

Simplemente no lo agregaría 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();
Marc Gravell
fuente
No diré nada sobre la legibilidad de este fragmento, pero así es como lo haría.
Matti Virkkunen
2
También es barato y fácil simplemente acortar la longitud del StringBuilder en uno después de que el bucle haya terminado.
Matt Greer
+1 por no agregarlo en lugar de eliminarlo, por usar un StringBuilder en lugar de + =, y por encadenar anexos en lugar de concatenar y agregar. :)
Guffa
1
El problema con esta solución es que el operador "si" se llama "n" veces.
magallanes
11
string str="This is test string.";
str=str.Remove(str.Length-1);
Altaf Patel
fuente
1
From String.Remove Method (Int32) : "Devuelve una nueva cadena en la que todos los caracteres de la instancia actual, comenzando en una posición especificada y continuando hasta la última posición, han sido eliminados".
DavidRR
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);
 }
Cheng Chen
fuente
Falta .ToArray()en su Joindeclaración. +1 aunque. Me ayudó.
desaivv
1
@desaivv: No, estaba usando esta sobrecarga:, public static string Join<T>(string separator, IEnumerable<T> values)es nueva en C # 4.0 :)
Cheng Chen
Ahh mi mal. Todavía usando VS2008 con 3.0
desaivv
5

Es una buena práctica usar a StringBuilderal concatenar muchas cadenas y luego puede usar el método Eliminar para deshacerse del carácter 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();
Dan Diplo
fuente
También recordé que puedes usar paramBuilder.Length - 1para eliminar el último carácter.
Dan Diplo
1
paramstr.Remove((paramstr.Length-1),1);

Esto funciona para eliminar un solo carácter del final de una cadena. Pero si lo uso para eliminar, digamos, 4 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);
Uzair Zaman Sheikh
fuente
2
Usando String.Remove Método (Int32, Int32) , para eliminar 4 caracteres desde el final de una cadena: result = source.Remove((source.Length - 4), 4);.
DavidRR
0

Agregue un 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;
}

luego usa:

yourStringBuilder.RemoveLast(",");
nznoor
fuente