簡體   English   中英

在 C# 中創建一個逗號分隔的字符串

[英]Create a comma-separated strings in C#

我有一個 object ,它包含許多值,其中一些(不是對象的所有值)需要放在CSV字符串中。 我的方法是這樣的:

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

有沒有更好、更優雅的方式?

如果您將所有值放在一個數組中,至少您可以使用string.Join

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

您還可以使用string.Join的重載,它將params string作為第二個參數,如下所示:

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

另一種方法是使用 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

您可以使用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 在我的機器上花費了 2 毫秒,而 StringBuilder.Append 花費了 5 毫秒。 所以有顯着的區別。 感謝 digAmAll 的提示。

如果您使用的是 .NET 4,您可以使用string.Join的重載,如果您在 List 中也有它們,則它需要一個 IEnumerable:

string.Join(", ", strings);

您可以覆蓋對象的 ToString() 方法:

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

是的,可以有多種方法來做到這一點。

如果你有strings List/Array ,那么你可以采用它;

string[] myStrings = new string[] { "Hi", "stackoverflow", };
string csvString = string.Join(",", myStrings);  // csvString :: Hi,stackoverflow

如果你有多個strings ,那么你可以采用它;

string st1 = "Hi";
string st2 = "stackoverflow";
string st3 = "team";
string csvString = string.Join(",", st1, st2, st3);  // csvString :: Hi,stackoverflow,team

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM