Lista de cadenas a una cadena

206

Digamos que tienes un:

List<string> los = new List<string>();

En este loco mundo funcional, vivimos en estos días cuál de estos sería el mejor para crear una cadena concatenando estos:

String.Join(String.Empty, los.ToArray());

StringBuilder builder = new StringBuilder();
los.ForEach(s => builder.Append(s));

string disp = los.Aggregate<string>((a, b) => a + b);

o llano viejo StringBuilder

¿O hay un mejor camino?

maxfridbe
fuente
9
Se parece a .Net 4 también incluirán un string.join (cadena, IEnumerable <string>), lo que le permite saltar el ToArray () msdn.microsoft.com/en-us/library/dd783876.aspx
Lucas

Respuestas:

289

Yo iría con la opción A:

String.Join(String.Empty, los.ToArray());

Mi razonamiento es porque el método Join fue escrito para ese propósito. De hecho, si observa Reflector, verá que se utilizó un código inseguro para optimizarlo realmente. Los otros dos también FUNCIONAN, pero creo que la función Unir se escribió para este propósito, y supongo que es la más eficiente. Aunque podría estar equivocado ...

Según @Nuri YILMAZ sin .ToArray(), pero esto es .NET 4+:

String.Join(String.Empty, los);
BFree
fuente
¡GEORGIA! Ni siquiera vi esta opción en primera lectura, más allá de ella.
Joel Coehoorn el
2
¿3 veces más rápido que el StringBuilder? Wow, pensé que sería más rápido, no me di cuenta de cuánto más rápido. Sin embargo, tiene sentido, se hace en código inseguro utilizando punteros, así que ... tiene sentido.
BFree
8
¡bonito! solo comentario: Join no necesita los.ToArray (), porque List <T> puede emitir IEnumarable <T>.
Nuri YILMAZ
8
@Nuri: Esta pregunta se hizo en 08, antes de que .Net 4 saliera. La sobrecarga que toma IEnumerable <T> se agregó en .Net 4.
BFree
2
String.Join junto con String.Concat es dorado. Por ejemplo: 'String.Concat ("{", String.Join (",", m_Data), "}");'
KornMuffin
51
string.Concat(los.ToArray());

Si solo desea concatenar las cadenas, use string.Concat () en lugar de string.Join ().

Pent Ploompuu
fuente
18

Si usa .net 4.0 puede usar un clasificador:

String.Join<string>(String.Empty, los);
mnieto
fuente
10

String.Join () se implementa bastante rápido, y como ya tiene una colección de las cadenas en cuestión, es probablemente la mejor opción. Sobre todo, grita "¡Me estoy uniendo a una lista de cadenas!" Siempre guay.

J Cooper
fuente
7
los.Aggregate((current, next) => current + "," + next);
patrona
fuente
5

Mi voto es una cuerda.

No es necesario crear evaluaciones lambda y funciones temporales, menos llamadas a funciones, menos empuje de pila y popping.

Tom Ritter
fuente