将List<int>转换为逗号分隔的字符串

155

有没有一种方法可以将List转换为逗号分隔的字符串?

我知道我可以使用循环来构建它,但是我认为你们中的某些人会有更酷的方法吧?

我真的想学习这些“技巧”,所以请解释一下或者链接到您使用的方法的文档。

8个回答

235
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7
聪明但缓慢而臃肿,因为它会为每个元素分配一个字符串。使用 StringBuilder 会更加高效。 - Steven Sudit
3
据我在网上(快速搜索)所看到的,String.Join 比使用 StringBuilder 更快。 - Yuriy Faktorovich
4
https://dev59.com/JXRB5IYBdhLWcg3wkH9N,你是错误的Steven。 - Yuriy Faktorovich
6
我认为Steven指的是n.ToString()这一部分,而不是String.Join。 - Larsenal
10
Larsenal说:但是StringBuilder.Append(Int32)内部仍然会在整数上调用ToString。 StringBuilder并没有神奇地避免为每个元素分配字符串的成本;它只是将它们巧妙地藏起来。 - itowlson
显示剩余12条评论

163

简单的解决方案是

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

我刚刚在我的代码中使用它,工作得非常好。


1
谢谢!这是一个很棒的方法。 - Irfan Ashraf
2
这是比已接受的答案更好的方法。采用此方法,您无需导入Linq,而且速度更快。 - Dave
太酷了!我从未知道string.Join有泛型重载。谢谢。 - mrmashal

11
List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(String.Join(",", list.Select(i => i.ToString()).ToArray()));

如果您无法使用.NET 4,这很好。 - Greg Woods

6

谢谢提供链接。这个字符串拼接问题比我预想的更加复杂和有教育意义! - Steven Sudit
我猜这已经过时了,所以不算是一个答案。 - Dave Cousineau

4
为了更加酷炫,我建议将其作为IEnumerable<T>的扩展方法来实现,这样就可以在任何IEnumerable上使用:
public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

使用方法如下:

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

两种可能的优化方案:1)无论如何都在每个项目后附加分隔符,然后在循环结束后删除多余的分隔符。2)为StringBuilder指定容量。 - Steven Sudit
1
如果你深入研究Reflector,就会发现Join函数通过求和长度来预先计算缓冲区大小,并通过在循环外附加第一个字符串,然后在循环内无条件地添加分隔符并为之后的字符串做准备。再加上一些不安全/内部的技巧,这应该是非常快速的。 - Steven Sudit
@Steven:听从了你的建议。 - cdiggins
1
你在扩展中硬编码了分隔符,并忽略了传入的分隔符值,还错过了分号。应该是 return string.Join(delim, self); - Andrew

1

我的“聪明”入口:

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

我只是还没想出如何有条件地添加逗号。


1
请不要在lambda表达式中使用带有副作用的Select。在这种情况下,您甚至没有使用y,因此您的Select本质上只是一个foreach - 因此请将其编写为foreach - Pavel Minaev
我并不是在建议这是一个好的解决方案。OP想要比foreach更有趣的东西。 - Larsenal
是的,但是滥用 Select 作为 foreach 已经超出了“有趣”的范畴,进入了“滥用”的领域。在这里更有趣的方法是使用 Enumerable.AggregateStringBuilder 作为种子值 - 试试看吧。 - Pavel Minaev
好主意。我得出去一下,但我可能会试试看。 - Larsenal

1

看起来相当快。

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));

0

你可以使用System.Linq库,它更高效:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));

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