2009-11-10 21 views
7

Tengo una matriz de Cadenas que quiero agregar a un generador de cadenas a través de LINQ.LINQ para anexar a StringBuilder desde una Cadena []

Lo que básicamente trato de decir es "Para cada elemento de esta matriz, agregue una línea a este StringBuilder".

Puedo hacer esto fácilmente usando un bucle foreach pero el siguiente código no parece hacer nada. ¿Qué me estoy perdiendo?

stringArray.Select(x => stringBuilder.AppendLine(x)); 

Cuando este tipo de obras:

foreach(String item in stringArray) 
{ 
    stringBuilder.AppendLine(item); 
} 
+0

No utilizaría el comando .Select ... ¿no está disponible el comando ForEach? – sebagomez

+0

He cambiado el nombre de StringBuilder y StringArray para utilizar un minúsculo primer carácter. Solo para dejar en claro que me estoy refiriendo a las variables de instancia y no a los tipos. –

+0

sí, es ... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) – sebagomez

Respuesta

18

Si insiste en hacerlo de una manera LINQy:

StringBuilder builder = StringArray.Aggregate(
          new StringBuilder(), 
          (sb, s) => sb.AppendLine(s) 
         ); 

Alternativamente, como Luke señaló en un comentario en otro post, se podría decir

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s)); 

La razón de que Select hace no funciona es porque Select es para proyectar y crear un IEnumerable de la proyección. Por lo que la línea de código

StringArray.Select(s => stringBuilder.AppendLine(s)) 

no iterar sobre la StringArray llamando stringBuilder.AppendLine(s) en cada iteración. Por el contrario, crea un IEnumerable<StringBuilder> que puede enumerarse.

supongo que se podría decir

var e = stringArray.Select(x => stringBuilder.AppendLine(x)); 
StringBuilder sb = e.Last(); 
Console.WriteLine(sb.ToString()); 

pero que es realmente horrible.

+0

Gracias Jason. Su respuesta explica por qué el método Select no logró el resultado que quería y por qué el foreach estaba funcionando. Me quedaré con el foreach. Estaba realmente curioso acerca de lo que me estaba perdiendo. Ahora sé. –

+0

¿Last() garantiza iterar? ¿En lugar de simplemente buscar stringArray [stringArray.count-1]? Creo que hubiera preferido ToList(); – Taemyr

0

StringArray.DoForAll (x => StringBuilder.AppendLine (x));

+0

¿Qué es 'DoForAll'? – jason

+0

Lo siento, he tenido este método de extensión durante tanto tiempo, lo olvidé no es parte del framework. \t CommonExtensions clase public static \t { \t \t pública DoForAll static void (IEnumerable esta artículos, Acción acción) \t \t \t donde T: Clase \t \t { \t \t \t si (acción == null) \t \t \t \t throw new ArgumentNullException ("action"); \t \t \t foreach (var artículo disponible artículos) \t \t \t \t acción (elemento); \t \t \t \t}} – vladhorby

+0

@vladhorby: Un punto de vista sobre por qué 'DoForAll' y otras extensiones equivalentes no se implementan: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason

6

Utilice el método de extensión "ForEach" en lugar de "Seleccionar".

stringArray.ForEach(x => stringBuilder.AppendLine(x)); 
Cuestiones relacionadas