J'ai du code LINQ qui génère une liste de chaînes, comme ceci: 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: p> Je devrais retrouver une chaîne qui ressemble à ceci: p> Comment puis-je faire cela rapidement? J'ai pensé à ceci: p> 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? P> p>
7 Réponses :
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());
Toute raison particulière de ne pas utiliser string.concat code>?
@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.
Que diriez-vous:
string s = data.Concat();
+1 Ce n'est pas la méthode la plus courte, mais l'OP demande clairement que le le plus rapide i>, et ceci effectivement des battements en utilisant toarray () code> suivi par
string.concat < / code> /
string.join code>.
@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 code>. Le problème est que vous traitez avec un
iEnumerable
@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.
Utilisez "Agrégation" comme ceci: Remarque: l'agrégat est dans l'espace de noms System.Linq en tant que méthode d'extension. P> P>
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: modifier: si et Seulement si les données sont iEnumerables d'un type EM> em>, vous devez le jeter à un é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. P> 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. P> p>
Depuis quand Linq a été équivalent à lent?
Pourquoi feriez-vous data.Cast
data.select (x => x.tostring ()) code>?
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 []) code> La surcharge appelle simplement la méthode standard
tostring code> interne. Si vous exécutez l'opération
Tostring code> sur les types de valeur vous-même, plutôt que de les boxer avec
couler code>, vous pouvez ensuite utiliser le
concat (chaîne []) code> surcharge.
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
alternative:
Vous pouvez utiliser cette déclaration. String.join ("", quelque ouverture); p>
Pouvez-vous expliquer un peu plus?
Peut-être pas le plus rapide, mais le plus simple!