我有一个整数数组:
int[] number = new int[] { 2,3,6,7 };
将这些转换为单个字符串的最简单方法是什么,其中数字由字符分隔(如:)"2,3,6,7"
?
我在C#和.NET 3.5中.
var ints = new int[] {1, 2, 3, 4, 5}; var result = string.Join(",", ints.Select(x => x.ToString()).ToArray()); Console.WriteLine(result); // prints "1,2,3,4,5"
编辑:
我看到几个解决方案广告使用StringBuilder.有人抱怨Join方法应该采用IEnumerable参数.
我要让你失望:) String.Join需要数组只有一个原因 - 性能.Join方法需要知道数据的大小,以有效地预分配必要的内存量.
这是String.Join方法的内部实现的一部分:
var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());
我懒得比较建议方法的性能.但有些东西告诉我,加入将赢得:)
尽管OP指定了.NET 3.5,但是想要在.NET 2.0中使用C#2执行此操作的人可以这样做:
string.Join(",", Array.ConvertAll(ints, Convert.ToString));
我发现在许多其他情况下,使用Convert.xxx函数是lambda的一个更简洁的替代方案,尽管在C#3中lambda可能有助于类型推理.
与.NET 2.0一起使用的相当紧凑的C#3版本是这样的:
string.Join(",", Array.ConvertAll(ints, item => item.ToString()))
这两种方法的一种混合是在IEnumerable
using System; using System.Collections.Generic; using System.Text; public static class Extensions { public static string JoinStrings(this IEnumerable source, Func projection, string separator) { StringBuilder builder = new StringBuilder(); bool first = true; foreach (T element in source) { if (first) { first = false; } else { builder.Append(separator); } builder.Append(projection(element)); } return builder.ToString(); } public static string JoinStrings (this IEnumerable source, string separator) { return JoinStrings(source, t => t.ToString(), separator); } } class Test { public static void Main() { int[] x = {1, 2, 3, 4, 5, 10, 11}; Console.WriteLine(x.JoinStrings(";")); Console.WriteLine(x.JoinStrings(i => i.ToString("X"), ",")); } }
String.Join(";", number.Select(item => item.ToString()).ToArray());
String
在我们加入它们之前,我们必须将每个项目转换为a ,因此使用Select
和lambda表达式是有意义的.这相当于map
其他一些语言.然后我们必须将生成的字符串集合转换回数组,因为String.Join
只接受字符串数组.
ToArray()
我觉得这有点难看.String.Join
应该真的接受IEnumerable
,没有理由将它限制为只有数组.这可能只是因为Join
来自泛型,当数组是唯一可用的类型集合时.
如果您的整数数组可能很大,那么使用StringBuilder可以获得更好的性能.例如:
StringBuilder builder = new StringBuilder(); char separator = ','; foreach(int value in integerArray) { if (builder.Length > 0) builder.Append(separator); builder.Append(value); } string result = builder.ToString();
编辑:当我发布这个时,我错误地认为"StringBuilder.Append(int value)"在内部设法附加整数值的字符串表示而不创建字符串对象.这是错误的:使用Reflector检查方法表明它只是附加了value.ToString().
因此唯一可能的性能差异是这种技术避免了一个数组创建,并且稍微释放了用于垃圾收集的字符串.在实践中,这不会产生任何可衡量的差异,所以我推荐了这个更好的解决方案.
问题是"将这些转换为单个字符串的最简单方法,其中数字由字符分隔".
最简单的方法是:
int[] numbers = new int[] { 2,3,6,7 }; string number_string = string.Join(",", numbers); // do whatever you want with your exciting new number string
编辑:这只适用于.NET 4.0+,我第一次阅读问题时错过了.NET 3.5的要求.