web-dev-qa-db-ja.com

コンマ区切りの文字列C#を作成しますか?

私は多くの値を保持するオブジェクトを持っていますが、それらのいくつか(オブジェクトのすべての値ではない)をcsv文字列に入れる必要があります。私のアプローチはこれでした:

string csvString = o.number + "," + o.id + "," + o.whatever ....

どういうわけか、より良い、よりエレガントな方法があると思いますか?

43
grady

すべての値を配列に入れる場合、少なくともstring.Joinを使用できます。

string[] myValues = new string[] { ... };
string csvString = string.Join(",", myValues);

次のように、2番目のパラメーターとしてstring.Joinを取るparams stringのオーバーロードを使用することもできます。

string csvString = string.Join(",", value1, value2, value3, ...);
97

別のアプローチは、System.Configuration名前空間/ AssemblyのCommaDelimitedStringCollectionクラスを使用することです。リストのように動作し、さらにコンマ区切りの文字列を返すオーバーライドされたToStringメソッドがあります。

長所-アレイよりも柔軟性があります。

短所-コンマを含む文字列を渡すことはできません。

CommaDelimitedStringCollection list = new CommaDelimitedStringCollection();

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

string s = list.ToString(); //Huey,Dewey,Louie
10
grysik44

_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();
    }
}
_

string.Joinは私のマシンで2msかかり、StringBuilder.Appendは5msかかりました。そのため、注目すべき違いがあります。ヒントをくれたdigAmAllに感謝します。

3
jb_

.Net 4を使用している場合、string.Joinのオーバーロードを使用できます。これは、リストにIEnumerableがある場合にも使用できます。

string.Join(", ", strings);
2
Jackson Pope

オブジェクトのToString()メソッドをオーバーライドできます。

public override string ToString ()
{
    return string.Format ("{0},{1},{2}", this.number, this.id, this.whatever);
}
1