Usando LINQ para concatenar cadenas
¿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?
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 StringBuilder
rendimiento horrible durante secuencias muy largas. Para uso regular del código String.Join
como 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 Aggregate
la variante StringBuilder
propuesta en el comentario de CodeMonkeyKing , que sería aproximadamente el mismo código que el normal, String.Join
incluido 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();
return string.Join(", ", strings.ToArray());
En .Net 4, hay una nueva sobrecarga que string.Join
acepta IEnumerable<string>
. El código entonces se vería así:
return string.Join(", ", strings);
¿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 Aggregate
nada aquí, que es mucho más lento.
¿Has mirado el método de extensión Agregado?
var sa = (new[] { "yabba", "dabba", "doo" }).Aggregate((a,b) => a + "," + b);
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.