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.
strgroupids = strgroupids.Remove(strgroupids.Length - 1);
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.
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.
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.
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(",");
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!
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()));
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.
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);
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,
puisqu'il n'est jamais ajouté+=
) 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înesStringBuilder
au lieu de concaténer des chaînes.