J’ai un tableau d’entiers :``
Quelle est la meilleure façon de convertir ceux-ci en une chaîne unique, où le nombre sont séparés par un caractère (comme : `` ) ?
Je suis en c# et .NET 3.5.
J’ai un tableau d’entiers :``
Quelle est la meilleure façon de convertir ceux-ci en une chaîne unique, où le nombre sont séparés par un caractère (comme : `` ) ?
Je suis en c# et .NET 3.5.
var ints = new int[] {1, 2, 3, 4, 5};
var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());
Console.WriteLine(result); // prints "1,2,3,4,5"
EDIT:
Je vois plusieurs solutions de publicité de l'utilisation de StringBuilder. Quelqu'un les plaintes qui se Joignent à la méthode un IEnumerable argument.
Je vais vous décevoir :) Chaîne de caractères.Rejoignez nécessite tableau pour une seule raison - performance. Méthode Join a besoin de savoir la taille des données efficacement préallouer la quantité nécessaire de la mémoire.
Voici une partie de la mise en œuvre interne de la Chaîne.Méthode Join:
// length computed from length of items in input array and length of separator
string str = FastAllocateString(length);
fixed (char* chRef = &str.m_firstChar) // note than we use direct memory access here
{
UnSafeCharBuffer buffer = new UnSafeCharBuffer(chRef, length);
buffer.AppendString(value[startIndex]);
for (int j = startIndex + 1; j <= num2; j++)
{
buffer.AppendString(separator);
buffer.AppendString(value[j]);
}
}
Je suis trop paresseux pour comparer les performances des méthodes proposées. Mais quelque chose me dit que la Jointure va gagner :)
Bien que l’OP spécifié .NET 3.5, ceux qui veulent faire dans .NET 2.0 avec C# 2 pouvez procédez comme suit :
J’ai trouver il y a un certain nombre d’autres cas où l’utilisation des fonctions Convert.xxx est une alternative plus propre à une lambda, même si en C# 3 la lambda pourrait aider l’inférence de type.
Une version assez compacte de C# 3 qui fonctionne avec .NET 2.0 est la suivante :
Un mélange des deux approches serait d’écrire une méthode d’extension sur IEnumerable qui utilise un StringBuilder. Voici un exemple, avec des surcharges différentes selon que vous souhaitez spécifier la transformation ou de compter uniquement sur la plaine ToString. J’ai nommé la méthode « JoinStrings » au lieu de « S’inscrire » pour éviter la confusion avec l’autre type de jointure. Peut-être quelqu'un peut trouver un meilleur nom :)
String.Join(";", number.Select(item => item.ToString()).ToArray());
Nous avons pour convertir chacun des éléments à un String
, avant de nous joindre à eux, il est donc logique d'utiliser Select
et une expression lambda. C'est l'équivalent d' map
dans certaines autres langues. Ensuite, nous avons pour convertir la collection de chaîne vers un tableau, car String.Join
seulement accepte un tableau de chaînes.
L' ToArray()
est un peu laid, je pense. String.Join
devrait vraiment accepter IEnumerable<String>
, il n'y a aucune raison de restreindre aux seuls tableaux. C'est sans doute parce qu' Join
est un avant génériques, lorsque les tableaux étaient le seul type de tapé la collection disponible.
Si votre tableau d'entiers peut être grande, vous obtiendrez de meilleures performances à l'aide d'un StringBuilder. E. g.:
StringBuilder builder = new StringBuilder();
char separator = ',';
foreach(int value in integerArray)
{
if (builder.Length > 0) builder.Append(separator);
builder.Append(value);
}
string result = builder.ToString();
Edit: Quand j'ai posté ce que j'étais sous l'impression erronée que "StringBuilder.Append(int valeur)" géré de manière interne à ajouter la représentation de chaîne de la valeur de l'entier sans la création d'un objet de type string. C'est faux: l'inspection de la méthode avec Réflecteur montre qu'il ajoute de la valeur.ToString().
Par conséquent, la seule différence est que cette technique permet d'éviter une création de la matrice, et libère les cordes pour la collecte des ordures légèrement plus tôt. Dans la pratique, cela ne fera aucune différence mesurable, donc j'ai upvoted cette meilleure solution.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.