2009-08-07 163 views
9

假设我有一个字符串的集合:生成逗号分隔值

"foo" 
"bar" 
"xyz" 

而且我想生成从列表中逗号分隔值成类似:

"foo, bar, xyz" 

通知缺乏“, “ 最后。

据我所知,有几十个的方式来产生这一点:

  • 使用for循环和的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(); 
} 

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

回答

4

的string.join是正确的答案,但在一个IEnumerable的情况下,LINQ的往往是比较短的循环:

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

LINQ的好用法! – 2009-08-12 14:46:54

26

您想要使用存在于BCL中的string.Join方法来达到此目的。

例子:

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

或者,如果你使用.NET 3.5,你可以用任何IEnumerable<string>这样做:

var output = string.Join(", ", myEnumerable.ToArray()); 

(请注意,这不给最好尽管它显然仍然是'O(n)',并且几乎适用于所有情况)。现在

,如果你的枚举是string类型(一般的IEnumerable<T>)的不是,你可以只使用Select方法将结果转换成字符串,例如

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

我不知道,如果你正在处理可能潜在包含逗号自己的价值观,但是这可以通过周围的引号(")括起来进行工作,并逃离报价,同样到CSV格式。

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

当然,再次分裂它们是一个稍微triciker任务,这需要一点正则表达式。

+1

嗯...我不知道这个函数存在(使我的问题看起来很糟糕)。 – 2009-08-07 14:57:30

+0

@阿德里安:不用担心。如果你不是来自.NET的背景,那么在框架中发现新事物并不总是直截了当 - 这是一个建立熟悉感的过程。 – Noldorin 2009-08-07 15:00:04

+1

这就是问题所在,自从第一个版本以来,我一直在做.NET。咄。 – 2009-08-07 15:00:55

2

使用

string s = string.Join (",", new string[] {"aaa", "bbb", "ccc"}); 
3
string finalstr = String.Join(",", strs); 
0

如果你有一个字符串数组,去Noldorin的解决方案。

但是,如果它的一些其他集合类型,我可能做到这一点:

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

正如其他人所说: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.join,并在更普遍的情况运作。然后,给定一个字符串数组或任何其他的IEnumerable,你可以这样调用:

string finalStr = MyStrings.ToDelimitedString(","); 
+0

是的,这显然是更常见的情况。 IEnumerable 比string []。 – 2009-08-07 15:06:04

+0

+1'结果。附加(d)。附加(s)'很有意思......从来没有想到这一点。看看目前这个简单的任务有多少种不同的方式会很有帮助。 – 2009-08-07 15:08:00

+0

非常酷的事情是抖动通常会优化额外的分配,所以代码确实_exactly_你想要它。 – 2009-08-07 15:09:14