在C#中将所有列表内容连接成一个字符串

64
在C#中如何将列表中的所有内容连接为一个字符串?

1
可能是Comma "izing" a list of items的重复问题。 - Matt Hamilton
9个回答

113

搜索如下内容:

List<string> list = new List<string>(); // { "This ", "is ", "your ", "string!"};
list.Add("This ");
list.Add("is ");
list.Add("your ");
list.Add("string!");

string concat = string.Join(" ", list.ToArray());

我该如何通过空格将它们分开? - kartal
4
string.Join(" ", list.ToArray()); 的意思是将列表 list 中的所有元素用空格连接成一个字符串。 - Matt Greer
9
不确定您还需要ToArray()部分(.NET 4):String.Join()似乎有List<string>和List<int>的重载。 - Ed Graham
3
@EdGraham 实际上,重载是针对 IEnumerable<T> 的,而对于 IEnumerable<string> 有一个特定的重载。 - GGG
在 "string!" 后面缺少一个空格! - Lucas
^ 错误的方式...应该删除所有其他尾随空格。 - Jim Balter

12
您可以使用“Aggregate”函数将列表中的所有项目连接起来。
以下是一个示例,将列表中的所有项目用逗号“,”连接起来。
string s = list.Aggregate((i, j) => i + "," + j).ToString();

注意:当列表没有元素时,这会产生异常。 - Goodies

9

如果您想在对象内设置某些属性并进行更多格式化,那么可以使用LINQ。

var output = string.Join(" ", list.Select(t => t.Prop1 + " " + t.Prop2));

这将在你的对象属性之间以及每个对象之间放置一个空格。

8
如果您需要在连接时转换列表元素,可以使用LINQ
string.Join(", ", mylist.Select(z => MyMethod(z)));

例子:

IEnumerable<string> mylist = new List<string>() {"my", "cool", "list"};
string joined = string.Join(", ", mylist.Select(z => MyMethod(z)));


public string MyMethod(string arg)
{
    return arg.ToUpper();
}

2
为什么它是-1?有任何原因吗? - Chris W

2

下面是使用StringBuilder的简单解决方案:

        var sb = new StringBuilder();
        strings.ForEach(s => sb.Append(s));
        var combinedList = sb.ToString();

1

像这样的东西:

    List<String> myStrings = new List<string>() { "string1", "string2", "string3" };
    StringBuilder concatenatedString = new StringBuilder();
    foreach (String myString in myStrings)
    {
        concatenatedString.Append(myString);
    }
    Console.WriteLine(concatenatedString.ToString());

0

试试这个:

request.AllFacilityId = request.FacilityIdList.Aggregate((i, j) => i + "," + j);

0
public static string ToString<T>(this IEnumerable<T> source, string delimiter)
{
    string d = String.Empty;
    var result = new StringBuilder();
    foreach(T item in source)
    {
        result.Append(d).Append(item.ToString());
        d = delimiter;
    }
    return result.ToString();
}

还有一种可选的更好的字符串转换方式的重载,用于单个值:

public static string ToString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> toString)
{
    string d = String.Empty;
    var result = new StringBuilder();
    foreach(T item in source)
    {
        result.Append(d).Append(toString(item));
        d = delimiter;
    }
    return result.ToString();
}

0

这里是使用LINQ实现使用两个空格分隔元素的版本:

var s = list.Aggregate(new StringBuilder(), (sb, current) => 
  sb.AppendFormat("{0}  ", current)).ToString();

Aggregate 方法将 StringBuilder(作为 sb)和列表中的当前元素(作为 current)传递给 lambda 表达式,该表达式可以执行任何需要的操作 - 例如,使用在 lambda 表达式主体中指定的某些格式将列表中的当前字符串附加到 StringBuilder 中。


3
没必要重复造轮子,string.Join 可以胜任所有任务。 - Matt Greer
@Matt:你说得对——它允许你指定一个分隔符(我忘了这一点),但在某些情况下,你可能仍然需要更强大的解决方案。 - Tomas Petricek
2
是的,没错。而且越多的LINQ被暴露出来就越好。 - Matt Greer

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