我有一个整数数组:
int[] number = new int[] { 2,3,6,7 };
Run Code Online (Sandbox Code Playgroud)
将这些转换为单个字符串的最简单方法是什么,其中数字由字符分隔(如:)"2,3,6,7"
?
我在C#和.NET 3.5中.
aku*_*aku 160
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"
Run Code Online (Sandbox Code Playgroud)
编辑:
我看到几个解决方案广告使用StringBuilder.有人抱怨Join方法应该采用IEnumerable参数.
我要让你失望:) String.Join需要数组只有一个原因 - 性能.Join方法需要知道数据的大小,以有效地预分配必要的内存量.
这是String.Join方法的内部实现的一部分:
var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());
Run Code Online (Sandbox Code Playgroud)
我懒得比较建议方法的性能.但有些东西告诉我,加入将赢得:)
Wil*_*ean 32
尽管OP指定了.NET 3.5,但是想要在.NET 2.0中使用C#2执行此操作的人可以这样做:
string.Join(",", Array.ConvertAll<int, String>(ints, Convert.ToString));
Run Code Online (Sandbox Code Playgroud)
我发现在许多其他情况下,使用Convert.xxx函数是lambda的一个更简洁的替代方案,尽管在C#3中lambda可能有助于类型推理.
与.NET 2.0一起使用的相当紧凑的C#3版本是这样的:
string.Join(",", Array.ConvertAll(ints, item => item.ToString()))
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 11
这两种方法的一种混合是在IEnumerable <T>上编写一个使用StringBuilder的扩展方法.这是一个示例,具有不同的重载,具体取决于您是要指定转换还是仅依赖于普通的ToString.我将方法命名为"JoinStrings"而不是"Join",以避免与其他类型的Join混淆.也许有人可以想出一个更好的名字:)
using System;
using System.Collections.Generic;
using System.Text;
public static class Extensions
{
public static string JoinStrings<T>(this IEnumerable<T> source,
Func<T, string> 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<T>(this IEnumerable<T> 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"), ","));
}
}
Run Code Online (Sandbox Code Playgroud)
String.Join(";", number.Select(item => item.ToString()).ToArray());
Run Code Online (Sandbox Code Playgroud)
String
在我们加入它们之前,我们必须将每个项目转换为a ,因此使用Select
和lambda表达式是有意义的.这相当于map
其他一些语言.然后我们必须将生成的字符串集合转换回数组,因为String.Join
只接受字符串数组.
ToArray()
我觉得这有点难看.String.Join
应该真的接受IEnumerable<String>
,没有理由将它限制为只有数组.这可能只是因为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();
Run Code Online (Sandbox Code Playgroud)
编辑:当我发布这个时,我错误地认为"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
Run Code Online (Sandbox Code Playgroud)
编辑:这只适用于.NET 4.0+,我第一次阅读问题时错过了.NET 3.5的要求.
归档时间: |
|
查看次数: |
56241 次 |
最近记录: |