9
votes

Le moyen le plus rapide de convertir une liste de chaînes en une seule chaîne concaténée?

J'ai du code LINQ qui génère une liste de chaînes, comme ceci: xxx

Comment puis-je convertir cette liste de chaînes en une grande chaîne concaténée? Disons que ces données ont ces entrées: xxx

Je devrais retrouver une chaîne qui ressemble à ceci: xxx

Comment puis-je faire cela rapidement? J'ai pensé à ceci: xxx

mais cela ne semble pas juste. S'il s'agit de la bonne solution, comment allez-y le transformer en une méthode d'extension?


0 commentaires

7 Réponses :


16
votes

Avez-vous essayé string.join? Si vous êtes déjà prêt à prendre les frais généraux d'un appel .tolist, utilisez plutôt .Tearray () et combinez-le avec un appel à String.join.

var joined = String.Concat(someQuery.ToArray());


3 commentaires

Toute raison particulière de ne pas utiliser string.concat ?


@Mehrdad, Nope, Rejoindre n'était que le premier qui est tombé dans ma tête aujourd'hui.


Dans mes tests, la performance est du cou et du cou avec la solution de Marc (pour une grande variété de longueurs de cordes et de collecte), vous avez donc mon vote.



22
votes

Que diriez-vous:

string s = data.Concat();


9 commentaires

+1 Ce n'est pas la méthode la plus courte, mais l'OP demande clairement que le le plus rapide , et ceci effectivement des battements en utilisant toarray () suivi par string.concat < / code> / string.join .


@Noldorin: le plus rapide est un peu indéfini;) Pour programmer ou machine?


Merci! Le plus rapide que je voulais dire pour la course à pied.


Changement mineur: il y a déjà une méthode d'extension de Concat fournie à ma SEP, alors je devais nommer la concatation de la concatation.


@Jasonh: Si la vitesse est la question, il est plus rapide de prendre deux passes sur la liste, la première fois pour calculer la longueur totale de sorte que le StringBuilder puisse être préventif.


@Jasonh: le renommage n'est pas strictement requis (même s'il pourrait être mieux en termes de lisibilité) car la méthode ms fournie par la MS prend un paramètre.


@Steven Sudit: Dans ce cas, vous venez d'utiliser string.concat . Le problème est que vous traitez avec un iEnumerable que vous ne connaissez pas la taille de (et que vous devez stocker des références d'éléments quelque part pour la réutilisation).


@Mehrdad: Donc, le code de Marc. Je mets son potey et j'ai eu une erreur de compilateur et IntelliSense m'a emmené dans les métadonnées pour la version MS, de sorte que le compilateur essayait définitivement d'aller pour la version MS.


@Jasonh: Je viens de le tester et ça a fonctionné comme prévu. La cause de votre problème est autre chose. Le code Marc prend un seul paramètre qui deviendra implicite car il s'agit d'une méthode d'extension, mais la version MS prend 2 paramètres (dont l'une est passée implicitement). Ils peuvent heureusement vivre ensemble.



3
votes

Utilisez "Agrégation" comme ceci: xxx

Remarque: l'agrégat est dans l'espace de noms System.Linq en tant que méthode d'extension.


0 commentaires

0
votes

Selon la façon dont le JIT l'optimise, String.ConCat () ou la méthode de Marc avec StressBuilder pourrait être plus rapide. Puisque vous utilisez Linq ici, je supposerai que la performance n'est pas la nécessité absolue n ° 1, auquel cas j'irais avec le plus facile à lire: xxx

modifier: si et Seulement si les données sont iEnumerables d'un type , vous devez le jeter à un : xxx

éditer 2: i Ne voulez pas vraiment dire que Linq est lent. Je veux seulement dire que la différence de vitesse entre les deux façons que j'ai mentionnées devrait être extrêmement minimale si même mesurable.

EDIT 3: Le JIT optimise presque toutes les opérations de la classe String, donc l'appel unique à l'exécution interne. de String.ConCat pourrait vraiment être plus rapide que d'utiliser StressBuilder. Je ne suis pas sûr que ce soit, mais vous devriez le tester pour vous assurer.


4 commentaires

Depuis quand Linq a été équivalent à lent?


Pourquoi feriez-vous data.Cast () plutôt que quelque chose comme data.select (x => x.tostring ()) ?


La chaîne a un membre string.concat (objet [] args) qui effectue très probablement les opérations de totrage internes plus efficacement. La seule raison pour laquelle vous auriez besoin de lancer vers l'objet est que des tableaux de type de valeur telles que INT [] ne peuvent pas être convertis implicitement en objet [].


Le concat (objet []) La surcharge appelle simplement la méthode standard tostring interne. Si vous exécutez l'opération Tostring sur les types de valeur vous-même, plutôt que de les boxer avec couler , vous pouvez ensuite utiliser le concat (chaîne []) surcharge.



1
votes
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();

0 commentaires

0
votes

alternative: xxx


0 commentaires

1
votes

Vous pouvez utiliser cette déclaration. String.join ("", quelque ouverture);


2 commentaires

Pouvez-vous expliquer un peu plus?


Peut-être pas le plus rapide, mais le plus simple!