2011-03-02 13 views
9

Básicamente, tengo una lista con varios elementos y quiero un cuadro de mensaje único para mostrarlos todos.¿Cómo coloco los contenidos de una lista en un solo MessageBox?

El más cercano que he conseguido es un cuadro de mensaje para cada elemento (utilizando foreach).

Lo que quiero es el equivalente a:

MessageBox.Show ("List contains:"+ 

Foreach (string str in list) 
{ str + Environment.Newline + } 

       ) 

Pero, obviamente, esto no va a funcionar! ¿Cuál es la forma correcta de hacer esto?

Respuesta

21

Usted puede unirse todo en una sola cadena con string.Join:

var message = string.Join(Environment.NewLine, list); 
MessageBox.Show(message); 

Sin embargo, si usted no tiene acceso a .NET 4, usted no tiene que la sobrecarga que toma un IEnumerable<string>. Tendrá que el repliegue en el que takes an array:

var message = string.Join(Environment.NewLine, list.ToArray()); 
MessageBox.Show(message); 
+0

Utilice '', "' en lugar de 'Enviornment.NewLine'. – stackptr

3

Si tiene .Net 4,0

string s = String.Join(",", list); 

Si no, pero tiene 3,5

string s = String.Join(",", list.ToArray()); 
4

También puede utilizar Stringbuilder:

StringBuilder builder = new StringBuilder(); 


foreach(string str in list) 
{ 
    builder.Append(str.ToString()).AppendLine(); 
}   

Messagebox.Show(builder.ToString()); 

Saludos

+0

Hay una sobrecarga de AppendLine que toma un parámetro. Usar eso haría que el código sea más simple. Además, hay una sobrecarga que toma un objeto y lo llama a ToString, por lo que no es necesario llamarlo usted mismo. –

3

Solo por diversión y en caso de que necesite hacer algo como eso con colecciones que no sean cuerdas una vez - una versión LINQ que usa Aggregate, que es la más cercana a su sintaxis de ejemplo. No lo use aquí, de hecho utilice String.Join en este caso, pero tenga en cuenta que tiene algo en LINQ que puede hacer lo que necesita.

MessageBox.Show("List contains: " + 
    list.Aggregate((str,val) => str + Environment.NewLine + val); 

EDIT: También, como Martinho Fernandes señaló, es mejor utilizar la clase StringBuilder en casos como el que, por lo que:

MessageBox.Show("List contains: " + list.Aggregate(new StringBuilder(), 
               (sb,val) => sb.AppendLine(val), 
               sb => sb.ToString())); 
+1

Si está usando 'Aggregate', es mejor agregar un StringBuilder, en lugar de una cadena:' .Aggregate (new StringBuilder(), (SB, x) => sb.AppendLine (x), SB => sb. ToString()); ': P –

+0

@Martinho Fernandes: ¡es una muy buena sugerencia para una solución muy loca! – Dyppl

+0

Considere pasar '' La lista contiene: "' al constructor 'StringBuilder'. Agregue la ausencia de paranthesis al final. – tm1

0

simplemente que necesita para hacer un bucle por ejemplo:

string total =""; 
    for(int i =0; i<x.count ;i++) 
    { 
    total =total+x[i] +"\n"; 
    } 
    MessageBox.Show(total); 
Cuestiones relacionadas