C# 将列表转换为逗号分隔的字符串

C# 将列表转换为逗号分隔的字符串,c#,collections,C#,Collections,有没有办法将列表转换成逗号分隔的字符串 using System.Linq; string str =string.Join(",", MyList.Select(x => x.NombreAtributo)); 我知道我可以循环并构建它,但不知何故,我认为你们中的一些人是一种更酷的方式 using System.Linq; string str =string.Join(",", MyList.Select(x => x.NombreAtributo)); 我真的很想学习这些类

有没有办法将列表转换成逗号分隔的字符串

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
我知道我可以循环并构建它,但不知何故,我认为你们中的一些人是一种更酷的方式

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
我真的很想学习这些类型的“技巧”,因此请解释或链接到您使用的方法的文档。

我的聪明条目:

List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())
        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));
using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));

只是还没有弄清楚如何有条件地添加逗号。

为了更酷,我将把它作为IEnumerable上的扩展方法,以便它可以在任何IEnumerable上工作:

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}
using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
按如下方式使用:

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));
using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));

对于这个问题的一个稍微复杂的版本,大约有一百万个解决方案——其中许多是缓慢的、有缺陷的,或者甚至没有编译——请参阅我关于这个主题的文章的评论:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
以及评论:

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

看起来相当快

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));
using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
简单的解决办法是

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)
using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));

我刚才在代码中使用了它,使用funtastic。

您可以使用System.Linq库;它更有效:

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

聪明但缓慢且臃肿,因为它为每个元素分配一个字符串。使用StringBuilder会更有效率。从我在网上看到的快速搜索String.Join比使用StringBuilder快。你是错误的Steven我认为Steven指的是n.ToString部分,而不是String.Join.Larsenal:但是StringBuilder.AppendInt32内部调用了整数上的ToString。StringBuilder不会神奇地避免为每个元素分配字符串的成本;它只是把它很好地塞进了视线之外。请不要在lambda中写带有副作用的Select。在本例中,您甚至没有使用y,因此您的Select本质上只是一个foreach,所以请这样编写它。我并不是建议将其作为一个好的解决方案。OP想要比foreach更有趣的东西。是的,但是滥用Select会让foreach变得有趣,然后变成滥用。这里一个更有趣的方法是使用Enumerable.Aggregate和StringBuilder作为种子值-试试看。好主意。我必须退出,但我可能会尝试一下。两种可能的优化:1在每个项目后面附加delimeter,然后在循环结束后删除多余的一个。2指定StringBuilder的容量。如果您挖出Reflector,那么Join会将长度相加以预先计算缓冲区大小,并通过在循环外部追加第一个字符串,然后在循环内部无条件地在下一个字符串之前追加定界符来启动泵。再加上一些不安全的/内部的技巧,速度应该非常快。@Steven:按照你的建议。你在扩展中硬编码了分隔符,忽略了传递给分隔符的值,并错过了分号。它应该是返回字符串;谢谢你的链接。这个字符串连接问题比我预想的更复杂,也更有教育意义!我猜它很旧,所以不算,但这不是答案。如果你不能使用.NET 4Thank,那就太好了!这是一个很好的方法,比公认的答案更好。使用这种方法,您不必导入Linq,而且速度更快。酷!我从来不知道字符串。Join有泛型重载。谢谢