C#列表与分隔符字符串

问题描述:

C#中有一个函数来快速将某些集合转换为字符串并用分隔符分隔值吗?C#列表<string>与分隔符字符串

例如:

List<string> names - >string names_together = "John, Anna, Monica"

您可以使用String.Join。如果你有一个List<string>那么你可以拨打ToArray第一:

List<string> names = new List<string>() { "John", "Anna", "Monica" }; 
var result = String.Join(", ", names.ToArray()); 

在.NET 4中,您不需要再ToArray,因为是需要一个IEnumerable<string>String.Join过载。

你也可以做到这一点使用LINQ,如果你想

var names = new List<string>() { "John", "Anna", "Monica" }; 
var joinedNames = names.Aggregate((a, b) => a + ", " + b); 

虽然我更喜欢非LINQ语法Quartermeister的答案,我想Aggregate可能执行速度较慢(可能更字符串连接操作)。

+6

感谢您的快速回复,两者都正常工作。你是对的我用Stopwatch类做了一个小的性能测量,而linq-way要慢得多:String.Join(“,”,names.ToArray()); - >花了18个刻度 总计((a,b)=> a +“,”+ b) - >花了736个刻度 – nan 2010-08-26 13:09:28

+1

是的,我认为Aggregate对于数学类型的操作更好。对于字符串这个操作,它与''for each''类似,只是附加到一个效率低下的字符串,因为您要为列表中存在的每个项目创建一个新的字符串。 – Bob 2010-08-26 13:26:11

+0

请注意,如果容器为空,则没有种子值的聚合将引发InvalidOperationException。使用种子版本Aggregate(seed,func)来避免错误处理代码或条件检查。 String.Join不会抛出空,所以不需要种子或额外的代码......再加上它不需要Linq并且语法更清晰一些。 – Huacanacha 2015-11-25 21:58:48

List<string> targets = new List<string>(); 

var InboxChecked = true; 
var BannerChecked = false; 
var EmailChecked = true; 

if (InboxChecked) 
{ 
    targets.Add("Inbox"); 
} 

if (BannerChecked) 
{ 
    targets.Add("Banner"); 
} 

if (EmailChecked) 
{ 
    targets.Add("Email"); 
} 

var index = 0; 

if (targets.Any()) 
{ 
    var aggregate = targets.Aggregate((s1, s2) => 
    { 
     return ++index == targets.Count - 1 ? s1 + " and " + s2 : s1 + ", " + s2; 
    }); 

    // aggregate.Dump(); 
} 

// returns -> Inbox and Email 
+8

这是为什么呢?它与OP几乎没有任何关系......? – Assimilater 2017-06-29 19:55:04