我有一个对象保存了很多值,其中一些值(而不是所有值)需要放在逗号分隔值字符串中。我的方法如下:
string csvString = o.number + "," + o.id + "," + o.whatever ....
有没有更好、更优雅的方法?
我有一个对象保存了很多值,其中一些值(而不是所有值)需要放在逗号分隔值字符串中。我的方法如下:
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, ...);
string.Join
使用可变参数数组。这意味着直接传递参数的代码将由编译器自动转换为使用数组。就开销而言,这些调用之间没有任何区别。 - Jeff Mercado另一种方法是使用来自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, ...)
的操作。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的提示。
string.Join
和 StringBuilder
一样快(如果不是稍微更快),因为它们都只分配一个字符串。 - digEmAllstring.Join
的一个缺点(直到 .NET 4.0)是它需要一个字符串数组,如果你只有一个通用的 IEnumerable<string>
,就必须分配一个。不过,无论如何,.NET 4.0 已经解决了这个问题。 - digEmAllstring.Join
实现,那两个重载(接受 string[]
)使用了一个名为 FastAllocateString
的外部方法,它可能(有时候)稍微快一些。令我惊讶的是,.net 4 引入的新的 string.Join
重载内部简单地使用了一个 StringBuilder
!因此,这两种方法没有区别,我的建议是为了简单起见(和“不要重复造轮子”的原则),使用 string.Join()
。 - digEmAllstring.Join(", ", strings);
public override string ToString ()
{
return string.Format ("{0},{1},{2}", this.number, this.id, this.whatever);
}
是的,有多种方法可以做到这一点。
如果您有字符串的List/Array
,那么您可以采用它;
string[] myStrings = new string[] { "Hi", "stackoverflow", };
string csvString = string.Join(",", myStrings); // csvString :: Hi,stackoverflow
如果你有多个字符串
,那么你可以采用它;
string st1 = "Hi";
string st2 = "stackoverflow";
string st3 = "team";
string csvString = string.Join(",", st1, st2, st3); // csvString :: Hi,stackoverflow,team
+
符号连接字符串被认为是效率较低的。它会创建更多需要被垃圾回收的对象。 - Phil Gan