如何将列表内容放入单个MessageBox中?

13

基本上,我有一个包含多个项目的列表,并且我希望一个单独的消息框来显示它们所有。

我最接近的方法是为每个项目使用 foreach 显示一个消息框。

我想要的是等同于:

MessageBox.Show ("List contains:"+

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

                )

但是显然这样做行不通!正确的方法是什么?

5个回答

31
你可以使用 string.Join 将所有内容连接成一个字符串:
var message = string.Join(Environment.NewLine, list);
MessageBox.Show(message);

但是,如果您无法访问.NET 4,就没有那个接受 IEnumerable<string> 的重载。您将不得不退回到接受 数组的方法

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

2
使用 ", " 代替 Enviornment.NewLine - lost_in_the_source

4
如果您有 .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());

问候


有一个带参数的AppendLine重载。使用它可以使代码更简单。此外,还有一个重载,它接受一个对象并调用ToString方法,因此无需自己调用。 - R. Martinho Fernandes

3

仅供娱乐,以及在您有一次需要使用非字符串集合的情况下 - 使用Aggregate的LINQ版本,它是最接近您示例语法的方法。在这种情况下不要使用它,确实使用String.Join,但请记住您在LINQ中有可以满足您需求的东西。

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

编辑:正如Martinho Fernandes指出的那样,在这种情况下最好使用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 - R. Martinho Fernandes
@Martinho Fernandes:这是一个非常好的建议,针对一个非常古怪的解决方案! - Dyppl
考虑将“List contains:”传递给StringBuilder构造函数。 在末尾添加缺失的括号。 - tm1

1

你只需要编写一个for循环,例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接