生成逗号分隔值

Adr*_*ong 9 .net c# string

假设我有一组字符串:

"foo"
"bar"
"xyz"
Run Code Online (Sandbox Code Playgroud)

我想从列表中生成逗号分隔值,如:

"foo, bar, xyz"
Run Code Online (Sandbox Code Playgroud)

注意最后缺少",".

我知道有很多方法可以生成这个:

  • 使用for-loop和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();
}
Run Code Online (Sandbox Code Playgroud)

对于上述场景,高度可重用的最佳代码是什么?为什么?

Nol*_*rin 26

您希望使用string.JoinBCL中存在的方法来实现此目的.

例:

var myArray = new string[] { "one", "two", "three" };
var output = string.Join(", ", myArray);
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是.NET 3.5,则可以使用以下任何方式执行此操作IEnumerable<string>:

var output = string.Join(", ", myEnumerable.ToArray());
Run Code Online (Sandbox Code Playgroud)

(请注意,这并不能提供所需的最佳性能,尽管它显然仍然是'O(n)',并且应该适用于几乎所有情况).

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

var output = string.Join(", ", myEnumerable.Select(e => e.ToString()).ToArray());
Run Code Online (Sandbox Code Playgroud)

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

var output = string.Join(", ", items.Select(x => x.Contains(",") ?
    "\"" + x.Replace("\"", "\"\"") + "\"" : x);
Run Code Online (Sandbox Code Playgroud)

当然,将它们重新分开是一个稍微重要的任务,这需要一些正则表达式.


Gle*_*nnS 4

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

someStringCollection.Aggregate((first, second) => first + ", " + second);
Run Code Online (Sandbox Code Playgroud)