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