我有一个包含许多值的对象,其中一些(不是来自对象的所有值)都需要放在csv字符串中。我的方法是:
string csvString = o.number + "," + o.id + "," + o.whatever ....
不知怎的,我认为有一种更好,更优雅的方式?
答案 0 :(得分:93)
如果您将所有值都放在数组中,至少可以使用string.Join
。
string[] myValues = new string[] { ... };
string csvString = string.Join(",", myValues);
您还可以使用string.Join
的重载,将params string
作为第二个参数,如下所示:
string csvString = string.Join(",", value1, value2, value3, ...);
答案 1 :(得分:10)
另一种方法是使用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
答案 2 :(得分:3)
您可以使用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 :(得分:2)
如果你正在使用.Net 4,你可以使用带有IEnumerable的string.Join
的重载,如果你在列表中也有它:
string.Join(", ", strings);
答案 4 :(得分:1)
您可以覆盖对象的ToString()方法:
public override string ToString ()
{
return string.Format ("{0},{1},{2}", this.number, this.id, this.whatever);
}