如何将int []连接到.NET中的字符分隔字符串?

Rir*_*iri 99 .net c# .net-3.5

我有一个整数数组:

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.有人抱怨Jo​​in方法应该采用IEnumerable参数.

我要让你失望:) String.Join需要数组只有一个原因 - 性能.Join方法需要知道数据的大小,以有效地预分配必要的内存量.

这是String.Join方法的内部实现的一部分:

var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());
Run Code Online (Sandbox Code Playgroud)

我懒得比较建议方法的性能.但有些东西告诉我,加入将赢得:)

  • .NET 4提供了一个String.Join重载,它接受IEnumerable作为参数.http://msdn.microsoft.com/en-us/library/dd783876.aspx (9认同)

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)

  • 这在调试时在Watch窗口中工作. (2认同)

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)


Jac*_*esB 8

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来自泛型,当数组是唯一可用的类型集合时.


Joe*_*Joe 5

如果您的整数数组可能很大,那么使用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().

因此唯一可能的性能差异是这种技术避免了一个数组创建,并且稍微释放了用于垃圾收集的字符串.在实践中,这不会产生任何可衡量的差异,所以我推荐了这个更好的解决方案.


Web*_*erP 5

问题是"将这些转换为单个字符串的最简单方法,其中数字由字符分隔".

最简单的方法是:

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的要求.