C# 生成逗号分隔的值

C# 生成逗号分隔的值,c#,.net,string,C#,.net,String,假设我有一组字符串: "foo" "bar" "xyz" 我想从列表中生成一个逗号分隔的值,如下所示: "foo, bar, xyz" 注意结尾缺少“,” 我知道有几十种方法可以实现这一点: 用于循环和string.Format()或StringBuilder 如果值>0,则使用整数计数器并删除结尾“,” 不要在第一次跑步时使用“,” 等等 我现在拥有的示例代码: if (strs.Count() > 0) { var sb = new StringBuilder(); f

假设我有一组字符串:

"foo"
"bar"
"xyz"
我想从列表中生成一个逗号分隔的值,如下所示:

"foo, bar, xyz"
注意结尾缺少“,”

我知道有几十种方法可以实现这一点:

  • 用于循环和string.Format()或StringBuilder
  • 如果值>0,则使用整数计数器并删除结尾“,”
  • 不要在第一次跑步时使用“,”
  • 等等
我现在拥有的示例代码:

if (strs.Count() > 0)
{
  var sb = new StringBuilder();
  foreach (var str in strs)
    sb.AppendFormat("{0}, ", str);
  return sb.Remove(0, 2).ToString();
}
对于上述场景,什么是高度可重用的最佳代码?为什么?

您希望使用BCL中的方法来实现此目的

例如:

var myArray = new string[] { "one", "two", "three" };
var output = string.Join(", ", myArray);
或者,如果您使用的是.NET 3.5,则可以使用任何
IEnumerable
来执行此操作,例如:

var output = string.Join(", ", myEnumerable.ToArray());
(请注意,这并不能提供所需的最佳性能,尽管它显然仍然是“O(n)”,并且应该适用于几乎所有情况)

现在,如果枚举的类型不是
string
(通常是
IEnumerable
),则可以使用
Select
方法将结果转换为字符串,例如

var output = string.Join(", ", myEnumerable.Select(e => e.ToString()).ToArray());

我不确定您处理的值本身是否可能包含逗号,但这可以通过将它们括在引号(
)中并转义引号来解决,类似于CSV格式

var output = string.Join(", ", items.Select(x => x.Contains(",") ?
    "\"" + x.Replace("\"", "\"\"") + "\"" : x);
当然,再次拆分它们是一项稍微复杂的任务,需要一些正则表达式。

使用

string s = string.Join (",", new string[] {"aaa", "bbb", "ccc"});

使用

如果您有字符串数组,请使用的解决方案

但如果是其他集合类型,我可能会这样做:

if (strs.Count() > 0)
{
  var sb = new StringBuilder();
  foreach (var str in strs)
    sb.AppendFormat("{0} {1}", (0 == sb.Length ? "" : ","), str);
  return sb.ToString();
}

正如其他人所说:
String.Join
通常是最好的方法。但是如果您只有一个IEnumerable而不是一个数组呢?也许您有代码在使用延迟执行从文件读取它们时枚举它们。在这种情况下,String.Join没有那么好,因为您必须在字符串上循环两次-一次创建数组,一次加入数组。在这种情况下,您需要类似以下内容:

public static string ToDelimitedString(this IEnumerable<string> source, string delimiter)
{
    string d = "";
    var result = new StringBuilder();

    foreach( string s in source)
    {
       result.Append(d).Append(s);
       d = delimiter;
    } 
    return result.ToString();
}
string finalStr = MyStrings.ToDelimitedString(",");

Join是正确的答案,但对于IEnumerable,Linq通常比for循环短:

someStringCollection.Aggregate((first, second) => first + ", " + second);

嗯…我不知道这个函数存在(使我的问题看起来很糟糕)@Adrian:不用担心。如果你不是.NET背景,那么在框架中发现新事物并不总是那么简单——这是一个建立熟悉度的漫长过程。这就是问题所在,我从第一个版本开始就在做.NET。Duh.Heh,我们都在学习BCL的新功能。我想你的问题是n已被投票支持表明这不是一个愚蠢的问题。:)您在这里要小心。如果任何字符串包含逗号,它将抛出csv。是的,这显然是更常见的情况。IEnumerable比string[].+1“result.Append(d).Append(s)“很有趣……从来没有想过。看看这个简单的任务目前有多少种不同的方式正在完成,这会有点不错。真正酷的是抖动通常会优化额外的分配,所以代码会完全按照您的要求执行。
someStringCollection.Aggregate((first, second) => first + ", " + second);