当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将int[]连接到.NET中的字符分隔字符串?》经验,为你挑选了6个好方法。

我有一个整数数组:

int[] number = new int[] { 2,3,6,7 };

将这些转换为单个字符串的最简单方法是什么,其中数字由字符分隔(如:)"2,3,6,7"

我在C#和.NET 3.5中.



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

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

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

var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());

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


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

2> Will Dean..:

尽管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()))


这在调试时在Watch窗口中工作.

3> Jon Skeet..:

这两种方法的一种混合是在IEnumerable 上编写一个使用StringBuilder的扩展方法.这是一个示例,具有不同的重载,具体取决于您是要指定转换还是仅依赖于普通的ToString.我将方法命名为"JoinStrings"而不是"Join",以避免与其他类型的Join混淆.也许有人可以想出一个更好的名字:)

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"), ","));
    }
}



4> JacquesB..:
String.Join(";", number.Select(item => item.ToString()).ToArray());

String在我们加入它们之前,我们必须将每个项目转换为a ,因此使用Select和lambda表达式是有意义的.这相当于map其他一些语言.然后我们必须将生成的字符串集合转换回数组,因为String.Join只接受字符串数组.

ToArray()我觉得这有点难看.String.Join应该真的接受IEnumerable,没有理由将它限制为只有数组.这可能只是因为Join来自泛型,当数组是唯一可用的类型集合时.



5> Joe..:

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

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



6> WebMasterP..:

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

最简单的方法是:

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有