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


116

有没有办法获取列表并将其转换为逗号分隔的字符串?

我知道我可以循环构建它,但是以某种方式,我认为你们中的某些人是一种更酷的方法吗?

我真的很想学习这些类型的“技巧”,因此请在您使用的方法上解释或链接到文档。

Answers:


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

7
聪明但缓慢且肿,因为它为每个元素分配一个字符串。使用StringBuilder会更有效率。
Steven Sudit

3
根据我在网上看到的(快速搜索)String.Join比使用StringBuilder更快。
Yuriy Faktorovich,2009年

3
stackoverflow.com/questions/585860/…,您输入的内容不正确史蒂文
Yuriy Faktorovich 09年

6
我认为Steven是指n.ToString()部分而不是String.Join。
拉森纳尔

9
Larsenal:但是StringBuilder.Append(Int32)仍然在内部对整数调用ToString。StringBuilder不能神奇地避免为每个元素分配字符串的成本;它只是将其很好地塞在视线之外。
itowlson

115

简单的解决方案是

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

我刚刚在我的代码中使用了它,工作很有趣。


1
谢谢!这是一个很好的方法
Irfan Ashraf

2
这是比公认的答案更好的方法。使用这种方法,您不必导入Linq,而且速度更快。
JoKeRxbLaCk

凉!我从不知道字符串。Join具有泛型重载。谢谢。
mrmashal


6

对于这个问题稍微复杂一点的大约一千亿解决方案-其中许多是缓慢,错误的甚至没有编译的-请参阅我对此主题的评论:

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

和StackOverflow评论:

埃里克·利珀特(Eric Lippert)的挑战“令人困惑的逗号”,最好的答案是?


感谢您的链接。事实证明,此字符串连接问题比我预期的要复杂得多,并且更具教育意义!
史蒂文·苏迪特

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的容量。
史蒂文·苏迪特

1
如果您挖出Reflector,结果表明Join将对长度求和以预先计算缓冲区大小,并通过在循环外附加第一个字符串,然后在循环内无条件地将定界符附加在循环之前,来“启动泵”。下一个字符串。结合一些不安全/内部的技巧,它应该非常快。
史蒂文·苏迪特

@Steven:听从您的建议。
cdiggins

1
您在扩展程序中对定界符进行了硬编码,并忽略了定界符的传入值,并错过了分号。应该是return string.Join(delim, self);
Andrew

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));

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
请不要Select在lambda中写有副作用。在这种情况下,您甚至都没有使用y,因此Select本质上您只是一个foreach-因此就这样编写。
帕维尔·米纳夫

我并不是说这是一个好的解决方案。OP需要比foreach更有趣的东西。
拉森纳尔

是的,但是滥用了过去,不再Selectforeach“有趣的” ,而是“滥用”。这里更有趣的方法是使用Enumerable.Aggregatewith StringBuilder作为种子值-试试看。
帕维尔米纳夫

好主意。我必须走出去,但我可以旋转一下。
拉森纳

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.