Eliminar el último carácter de la cadena


261

Estoy recuperando mucha información en una lista, vinculada a una base de datos y quiero crear una cadena de grupos, para alguien que esté conectado al sitio web.

Lo uso para probar pero esto no es dinámico, por lo que es realmente malo:

string strgroupids = "6";

Quiero usar esto ahora. Pero la cadena devuelta es algo así como1,2,3,4,5,

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

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

Quiero eliminar ,después, 5pero definitivamente no funciona.


9
La solución al problema directo es strgroupids = strgroupids.TrimEnd(new char[] { ',' });pero hay mejores ideas a continuación.
Henk Holterman

Respuestas:


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

MSDN:

String.Remove (Int32):

Elimina todos los caracteres de esta cadena que comienzan en una posición específica y continúan hasta la última posición


1
Perfecto para eliminar el último carácter si desea eliminar el último carácter. Para la pregunta de OP, el problema no debería existir si no crea un carácter final. Verifique la solución @ Øyvind Bråthen si está en el bote de OP.
aloisdg se muda a codidact.com

86

¿Qué hay de hacerlo de esta manera?

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

Un montón más limpio.

Agregará todos los elementos dentro groupIdscon un ','entre cada uno, pero no pondrá un ','al final.


44
Solo en C # 4.0. En C # 3.5 tendrás que convertir groupIds a array.
xanatos

3
Este solucionará el problema de OP.
aloisdg se muda a codidact.com

29

Las cadenas en c # son inmutables. Cuando en su código lo hace strgroupids.TrimEnd(',');o strgroupids.TrimEnd(new char[] { ',' });la strgroupidscadena no se modifica .

Necesitas hacer algo como en su strgroupids = strgroupids.TrimEnd(',');lugar.

Para citar desde aquí :

Las cadenas son inmutables: el contenido de un objeto de cadena no se puede cambiar una vez creado el objeto, aunque la sintaxis hace que parezca que puede hacerlo. Por ejemplo, cuando escribe este código, el compilador realmente crea un nuevo objeto de cadena para contener la nueva secuencia de caracteres, y ese nuevo objeto se asigna a b. La cadena "h" es elegible para la recolección de basura.


11

Agregar un método de extensión.

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

luego use:

yourString.RemoveLast(",");

La idea básica de crear un método de extensión es buena. Sin embargo, en mi humilde opinión, el método implementado aquí es excesivo, para este uso. OP sabía que el carácter que quería estaba al final de la cadena, por lo que no hay razón para tener el gasto de buscar esa cadena, a través de LastIndexOf. Simplemente tome la respuesta aceptada y conviértala en un método de extensión. O generalice esa respuesta, pasando int n, el número de caracteres para eliminar al final. En segundo lugar, prueba la longitud cero, pero eso no elimina todas las excepciones posibles. Sería mejor hacerlo int index = ..LastIndexOf.., entonces if (index >= 0).
ToolmakerSteve

Tercero, el parámetro string characterestá mal nombrado. Cuarto, no es inmediatamente obvio para los futuros programadores que esto está eliminando caracteres al final de la cadena. Oh, espera, no necesariamente lo está haciendo. Está buscando la cadena. Podría estar eliminando de algún lugar en el medio. Ahora el programador de mantenimiento tiene que examinar todos los usos del método, para ver qué estaba tratando de lograr. No es un buen método para llamar, por esta simple necesidad de eliminar del final de una cadena. Perdón por todas las críticas; Lo hago para cualquiera que adopte este método, para que entiendan.
ToolmakerSteve

Quinto, en el contexto de la pregunta, String.TrimEndsería más apropiado de usar. Pero espere, eso ya existe, y se mencionó en la pregunta original y en varias otras respuestas hace 3 años, ¡no es necesario inventar un nuevo método! ¿Cuál es el beneficio de su enfoque?
ToolmakerSteve

7

Elimina cualquier coma final:

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

Sin embargo, esto es al revés, usted escribió el código que agrega la coma en primer lugar. En su string.Join(",",g)lugar, debe usar , suponiendo que ges a string[]. ¡Dale un mejor nombre que gtambién!


4

Como alternativa a agregar una coma para cada elemento, puede usar String.Join:

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

Esto agregará el separador ("," en este caso) entre cada elemento de la matriz.


3
string strgroupids = string.Empty;

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

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

Tenga en cuenta que el uso de ForEachaquí normalmente se considera "incorrecto" (lea, por ejemplo, http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Usando algunos LINQ:

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

Sin subcadena final:

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

1
@KierenJohnstone string.Joines perfecto SI tienes una serie de cadenas como fuente O tienes C # 4.0
xanatos

3

Adicional a la solución de sll: es mejor recortar la cadena en caso de que haya algunos espacios en blanco al final.

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

2

string.Joines mejor, pero si realmente quieres un LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Algunas notas:

  • string.Joiny foreachson ambos mejores que este enfoque, mucho más lento
  • No es necesario eliminar el último ,ya que nunca se adjunta
  • El operador de incremento ( +=) es útil para agregar cadenas
  • .ToString() es innecesario ya que se llama automáticamente al concatenar sin cadenas
  • Al manejar cadenas grandes, se StringBuilderdebe considerar en lugar de concatenar cadenas

1
ERROR - necesita revertir la prueba if - debería serif(strgroupids != string.Empty){
ToolmakerSteve

Pero gracias por agregar una respuesta que muestra cómo usar for-each para construir la cadena sin el "," no deseado al final. Tenga en cuenta que no es necesario hacer una lambda y ForEach; foreach (var g in groupIds) {funciona igual de bien :)
ToolmakerSteve

n1 @ToolmakerSteve, sobre el LINQ, entonces es el código OP que tomé
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.