2011-03-02 86 views
9

基本上,我有一个列表中有多个项目,我想要一个消息框来显示它们全部。如何将列表的内容放入单个MessageBox中?

我得到的最接近的是每个项目的消息框(使用foreach)。

我要的是等价的:

MessageBox.Show ("List contains:"+ 

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

       ) 

但很明显,这是不行的!这样做的正确方法是什么?

回答

21

你可以参加一切成一个单一的字符串string.Join

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

但是,如果你没有访问.NET 4,你不会有重载需要一个IEnumerable<string>。你将不得不退却上takes an array的一个:

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

使用'“,”'而不是'Enviornment.NewLine'。 – stackptr 2013-10-19 15:34:19

3

如果你有.NET 4.0

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

如果你没有,但有3.5

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

您还可以使用Stringbuilder:

StringBuilder builder = new StringBuilder(); 


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

Messagebox.Show(builder.ToString()); 

Regards

+0

AppendLine接受一个参数的重载。使用它可以使代码更简单。此外,还有一个重载需要一个对象并在其上调用ToString,所以不需要自己调用它。 – 2011-03-02 04:11:11

3

只是为了好玩,以防万一您需要使用非字符集合进行一次操作 - LINQ版本使用Aggregate,这与您的示例语法最接近。不要在这里使用它,在这种情况下确实使用String.Join,但请记住,您在LINQ中有一些可以执行您需要的操作。

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

编辑:另外,像Martinho费尔南德斯指出,这是更好地使用StringBuilder类在这样的情况下,如此:

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

如果你使用'Aggregate',最好聚合一个StringBuilder,而不是一个字符串:'.Aggregate(new StringBuilder(),(sb,x)=> sb.AppendLine(x),sb => sb。 ToString());':P – 2011-03-02 04:17:25

+0

@Martinho Fernandes:对于非常古怪的解决方案,这是一个非常好的建议! – Dyppl 2011-03-02 04:18:55

+0

考虑将''List包含:''传递给'StringBuilder'构造函数。 在结尾处添加缺少的缺陷。 – tm1 2017-01-20 13:12:19

0

只是你需要做一个循环,例如:

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