web-dev-qa-db-fra.com

Supprimer le dernier caractère de la chaîne

Je récupère beaucoup d'informations dans une liste, liée à une base de données et je souhaite créer une chaîne de groupes pour une personne connectée au site Web.

J'utilise ceci pour tester mais ce n'est pas dynamique, donc c'est vraiment mauvais:

string strgroupids = "6";

Je veux utiliser ceci maintenant. Mais la chaîne renvoyée est quelque chose comme 1,2,3,4,5,

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

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

Je veux supprimer le , après le 5 mais il ne fonctionne définitivement pas.

232
Kiwimoisi
strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

String.Remove (Int32):

Supprime tous les caractères de cette chaîne commençant à une position spécifiée et se poursuivant jusqu'à la dernière position.

550
sll

Qu'en est-il de le faire de cette façon

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

Un beaucoup plus propre.

Il ajoutera tous les éléments à l'intérieur de groupIds avec un ',' entre chacun, mais il ne mettra pas un ',' à la fin.

80
Øyvind Bråthen

Les chaînes en c # sont immuables. Dans votre code, vous faites strgroupids.TrimEnd(','); ou strgroupids.TrimEnd(new char[] { ',' });, la chaîne strgroupids n'est pas modifiée .

Vous devez faire quelque chose comme strgroupids = strgroupids.TrimEnd(','); à la place.

Pour citer ici :

Les chaînes sont immuables - le contenu d'un objet chaîne ne peut plus être modifié une fois que l'objet est créé, bien que la syntaxe donne l'impression que vous pouvez le faire. Par exemple, lorsque vous écrivez ce code, le compilateur crée en fait un nouvel objet chaîne pour contenir la nouvelle séquence de caractères, et ce nouvel objet est affecté à b. La chaîne "h" est alors éligible pour la récupération de place.

25
Andy Johnson

Ajouter une méthode d'extension.

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

puis utilisez:

yourString.RemoveLast(",");
9
nznoor

Supprime les virgules de fin:

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

C'est à l'envers, vous avez écrit le code qui ajoute la virgule en premier lieu. Vous devez utiliser string.Join(",",g) à la place, en supposant que g est un string[]. Donnez-lui un meilleur nom que g aussi!

6
Kieren Johnstone
string strgroupids = string.Empty;

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

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

Notez que l'utilisation de ForEach ici est normalement considérée comme "mauvaise" (à lire, par exemple, http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx )

Utiliser un peu de LINQ:

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

Sans fin de sous-chaîne:

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

En guise d'alternative à l'ajout d'une virgule pour chaque élément, vous pouvez simplement utiliser String.Join:

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

Cela ajoutera le séparateur ("," dans cet exemple) entre chaque élément du tableau.

3
Gary.S

Supplément à la solution de sll: Il est préférable de couper la chaîne au cas où il y aurait des blancs à la fin.

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

string.Join est préférable, mais si vous vraiment voulez un LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Quelques notes:

  • string.Join et foreach sont tous deux meilleurs que cela, beaucoup plus lentement, approche
  • Pas besoin de supprimer le dernier , puisqu'il n'est jamais ajouté
  • L'opérateur d'incrémentation (+=) est pratique pour ajouter des chaînes
  • .ToString() n'est pas nécessaire car il est appelé automatiquement lors de la concaténation de non-chaînes
  • Lorsque vous manipulez des chaînes de grande taille, vous devez considérer StringBuilder au lieu de concaténer des chaînes.
2
user3638471