Supprimer le dernier caractère de la chaîne

261

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

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

string strgroupids = "6";

Je veux l'utiliser maintenant. Mais la chaîne retournée est quelque chose comme1,2,3,4,5,

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

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

Je veux supprimer l' ,after, 5mais ça ne marche définitivement pas.

Kiwimoisi
la source
9
La solution au problème direct est strgroupids = strgroupids.TrimEnd(new char[] { ',' });mais il y a de meilleures idées ci-dessous.
Henk Holterman

Réponses:

614
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

sll
la source
1
Idéal pour supprimer le dernier caractère si vous souhaitez supprimer le dernier caractère. Pour la question d'OP, le problème ne devrait pas exister si vous ne créez pas de caractère de fin. Vérifiez la solution @ Øyvind Bråthen si vous êtes dans le bateau d'OP.
aloisdg passe à codidact.com le
86

Qu'en est-il de cette façon

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

Un beaucoup plus propre.

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

Øyvind Bråthen
la source
4
Uniquement en C # 4.0. En C # 3.5, vous devrez convertir groupIds en tableau.
xanatos
3
Celui-ci résoudra le problème OP.
aloisdg passe à codidact.com le
29

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

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

Pour citer d' ici :

Les chaînes sont immuables - le contenu d'un objet chaîne ne peut pas être modifié après la création de l'objet, bien que la syntaxe le fasse apparaître comme si vous pouviez 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.

Andy Johnson
la source
11

Ajoutez 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(",");
nznoor
la source
L'idée de base de la création d'une méthode d'extension est bonne. Cependant, à mon humble avis, la méthode implémentée ici est exagérée, pour cette utilisation. OP savait que le caractère qu'il voulait se trouvait à la fin de la chaîne, donc aucune raison d'avoir à dépenser la recherche de cette chaîne, via LastIndexOf. Prenez simplement la réponse acceptée et faites-en une méthode d'extension. Ou généralisez cette réponse, en passant int nle nombre de caractères à supprimer à la fin. Deuxièmement, vous testez la longueur zéro, mais cela n'élimine pas toutes les exceptions possibles. Ce serait mieux de le faire int index = ..LastIndexOf.., alors if (index >= 0).
ToolmakerSteve
Troisièmement, le paramètre string characterest mal nommé. Quatrièmement, il n'est pas immédiatement évident pour les futurs programmeurs que cela supprime les caractères à la fin de la chaîne. Oh, attendez, ce n'est pas nécessairement le cas. Il recherche la chaîne. Il pourrait être retiré de quelque part au milieu. Le programmeur de maintenance doit maintenant examiner toutes les utilisations de la méthode, pour voir ce qui essayait d'être accompli. Pas une bonne méthode à appeler, pour ce simple besoin de supprimer de la fin d'une chaîne. Désolé pour toutes les critiques; Je le fais pour tous ceux qui adoptent cette méthode, afin qu'ils comprennent.
ToolmakerSteve
Cinquièmement, dans le contexte de la question, il String.TrimEndserait plus approprié de l'utiliser. Mais attendez, cela existe déjà - et a été mentionné dans la question d'origine et plusieurs autres réponses il y a 3 ans - pas besoin d'inventer une nouvelle méthode! Quel est l'avantage de votre approche?
ToolmakerSteve
7

Supprime toutes les virgules de fin:

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

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

Kieren Johnstone
la source
4

Au lieu d'ajouter une virgule pour chaque élément, vous pouvez simplement utiliser String.

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

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

Gary.S
la source
3
string strgroupids = string.Empty;

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

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

Notez que l'utilisation d' ForEachici est normalement considérée comme "incorrecte" (lire par exemple http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

Utilisation de LINQ:

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

Sans sous-chaîne d'extrémité:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));
xanatos
la source
1
@KierenJohnstone string.Joinest parfait SI vous avez un tableau de chaînes comme source OU vous avez C # 4.0
xanatos
3

En plus de 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);
tanzer
la source
2

string.Joinc'est mieux, mais si vous voulez vraiment un LINQ ForEach:

var strgroupids = string.Empty;

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

    strgroupids += g;
});

Quelques notes:

  • string.Join et foreach sont à la fois mieux que cela, approche beaucoup plus lente
  • Pas besoin de retirer le dernier , car il n'est jamais ajouté
  • L'opérateur d'incrémentation (+= ) est pratique pour l'ajout aux chaînes
  • .ToString() est inutile car il est appelé automatiquement lors de la concaténation de non-chaînes
  • Lors de la manipulation de grandes chaînes, StringBuilderdoit être pris en compte au lieu de concaténer des chaînes

la source
1
BOGUE - besoin d'inverser le test if - devrait l'êtreif(strgroupids != string.Empty){
ToolmakerSteve
Mais merci d'avoir ajouté une réponse qui montre comment utiliser for-each pour construire la chaîne sans le "," indésirable à la fin! Notez qu'il n'est pas nécessaire de faire un lambda et ForEach; foreach (var g in groupIds) {fonctionne aussi bien :)
ToolmakerSteve
n1 @ToolmakerSteve, à propos du LINQ alors c'est le code OP que j'ai pris