Usando LINQ para concatenar cadenas

Resuelto tags2k asked hace 15 años • 17 respuestas

¿Cuál es la forma más eficiente de escribir la vieja escuela?

StringBuilder sb = new StringBuilder();
if (strings.Count > 0)
{
    foreach (string s in strings)
    {
        sb.Append(s + ", ");
    }
    sb.Remove(sb.Length - 2, 2);
}
return sb.ToString();

...en LINQ?

tags2k avatar Oct 20 '08 15:10 tags2k
Aceptado

Esta respuesta muestra el uso de LINQ ( Aggregate) como se solicita en la pregunta y no está diseñada para el uso diario. Debido a que esto no utiliza un StringBuilderrendimiento horrible durante secuencias muy largas. Para uso regular del código String.Joincomo se muestra en la otra respuesta

Utilice consultas agregadas como esta:

string[] words = { "one", "two", "three" };
var res = words.Aggregate(
   "", // start with empty string to handle empty list case.
   (current, next) => current + ", " + next);
Console.WriteLine(res);

Esto produce:

, Uno, dos, tres

Un agregado es una función que toma una colección de valores y devuelve un valor escalar. Los ejemplos de T-SQL incluyen mínimo, máximo y suma. Tanto VB como C# admiten agregados. Tanto VB como C# admiten agregados como métodos de extensión. Usando la notación de puntos, simplemente se llama a un método en un objeto IEnumerable .

Recuerde que las consultas agregadas se ejecutan inmediatamente.

Más información – MSDN: Consultas agregadas


Si realmente desea utilizar Aggregatela variante StringBuilderpropuesta en el comentario de CodeMonkeyKing , que sería aproximadamente el mismo código que el normal, String.Joinincluido un buen rendimiento para una gran cantidad de objetos:

 var res = words.Aggregate(
     new StringBuilder(), 
     (current, next) => current.Append(current.Length == 0? "" : ", ").Append(next))
     .ToString();
Jorge Ferreira avatar Oct 20 '2008 08:10 Jorge Ferreira
return string.Join(", ", strings.ToArray());

En .Net 4, hay una nueva sobrecarga que string.Joinacepta IEnumerable<string>. El código entonces se vería así:

return string.Join(", ", strings);
Amy B avatar Oct 20 '2008 13:10 Amy B

¿Por qué utilizar Linq?

string[] s = {"foo", "bar", "baz"};
Console.WriteLine(String.Join(", ", s));

Funciona perfectamente y, IEnumerable<string>hasta donde recuerdo, acepta cualquiera. No se necesita Aggregatenada aquí, que es mucho más lento.

Armin Ronacher avatar Sep 23 '2008 18:09 Armin Ronacher

¿Has mirado el método de extensión Agregado?

var sa = (new[] { "yabba", "dabba", "doo" }).Aggregate((a,b) => a + "," + b);
Robert S. avatar Sep 23 '2008 18:09 Robert S.

Ejemplo real de mi código:

return selected.Select(query => query.Name).Aggregate((a, b) => a + ", " + b);

Una consulta es un objeto que tiene una propiedad Nombre que es una cadena y quiero los nombres de todas las consultas en la lista seleccionada, separados por comas.

Daniel Earwicker avatar Oct 20 '2008 08:10 Daniel Earwicker