创建逗号分隔的字符串C#?

gra*_*ady 49 c# string-concatenation

我有一个包含许多值的对象,其中一些(不是来自对象的所有值)都需要放在csv字符串中.我的方法是这样的:

string csvString = o.number + "," + o.id + "," + o.whatever ....
Run Code Online (Sandbox Code Playgroud)

不知怎的,我认为有更好,更优雅的方式?

Øyv*_*hen 103

如果将所有值都放在一个数组中,至少可以使用string.Join.

string[] myValues = new string[] { ... };
string csvString = string.Join(",", myValues);
Run Code Online (Sandbox Code Playgroud)

您还可以使用过载的string.Join是需要params string为这样的第二个参数:

string csvString = string.Join(",", value1, value2, value3, ...);
Run Code Online (Sandbox Code Playgroud)

  • @fear:`string.Join`使用params数组.直接传递参数的含义代码将被转换为编译器自动使用数组.就开销而言,呼叫之间没有区别. (4认同)

gry*_*k44 12

另一种方法是使用System.Configuration命名空间/程序集中的CommaDelimitedStringCollection类.它的行为类似于列表,它具有重写的ToString方法,该方法返回逗号分隔的字符串.

优点 - 比阵列更灵活.

缺点 - 您无法传递包含逗号的字符串.

CommaDelimitedStringCollection list = new CommaDelimitedStringCollection();

list.AddRange(new string[] { "Huey", "Dewey" });
list.Add("Louie");
//list.Add(",");

string s = list.ToString(); //Huey,Dewey,Louie
Run Code Online (Sandbox Code Playgroud)


jb_*_*jb_ 5

您可以使用该string.Join方法执行类似的操作string.Join(",", o.Number, o.Id, o.whatever, ...)

编辑:正如digEmAll所说,string.Join比StringBuilder快。他们使用 string.Join 的外部实现。

分析代码(当然在没有调试符号的发行版中运行):

class Program
{
    static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();
        string r;
        int iter = 10000;

        string[] values = { "a", "b", "c", "d", "a little bit longer please", "one more time" };

        sw.Restart();
        for (int i = 0; i < iter; i++)
            r = Program.StringJoin(",", values);
        sw.Stop();
        Console.WriteLine("string.Join ({0} times): {1}ms", iter, sw.ElapsedMilliseconds);

        sw.Restart();
        for (int i = 0; i < iter; i++)
            r = Program.StringBuilderAppend(",", values);
        sw.Stop();
        Console.WriteLine("StringBuilder.Append ({0} times): {1}ms", iter, sw.ElapsedMilliseconds);
        Console.ReadLine();
    }

    static string StringJoin(string seperator, params string[] values)
    {
        return string.Join(seperator, values);
    }

    static string StringBuilderAppend(string seperator, params string[] values)
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(values[0]);
        for (int i = 1; i < values.Length; i++)
        {
            builder.Append(seperator);
            builder.Append(values[i]);
        }
        return builder.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

string.Join 在我的机器上花费了 2 毫秒,而 StringBuilder.Append 花费了 5 毫秒。所以有显着的区别。感谢 digAmAll 的提示。

  • `string.Join` 和 `StringBuilder` 一样快(如果不是稍微快一点的话),因为它们都只分配一个字符串 (2认同)