Создать разделенные запятыми строки C#?
У меня есть объект, который имеет много значений, некоторые из них (не все значения из объекта) должны быть помещены в строку CSV-файла. Мой подход был таков:--2-->
string csvString = o.number + "," + o.id + "," + o.whatever ....
почему-то я думаю, что есть более элегантный способ?
5 ответов
если поставить все значения в массив, по крайней мере, вы можете использовать string.Join
.
string[] myValues = new string[] { ... };
string csvString = string.Join(",", myValues);
вы также можете использовать перегрузку string.Join
что происходит params string
в качестве второго параметра такой:
string csvString = string.Join(",", value1, value2, value3, ...);
другой подход-использовать класс CommaDelimitedStringCollection из System.Пространство имен/сборка конфигурации. Он ведет себя как список плюс он имеет переопределенный метод ToString, который возвращает строку, разделенную запятыми.
Pros-более гибкий, чем массив.
Cons - вы не можете передать строку, содержащую запятую.
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, ...)
.
edit: как сказал digEmAll, строка.Join быстрее, чем StringBuilder. Они используют внешнюю реализацию для строки.Присоединяться.
код профилирования (конечно, запускается в выпуске без отладочных символов):
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();
}
}
строку.Регистрация заняла 2ms на моей машине и StringBuilder.Добавить 5 мс. Так что есть примечательная разница. Спасибо digAmAll за подсказку.
Если вы используете .Net 4, Вы можете использовать перегрузку для string.Join
это занимает IEnumerable, если у вас есть их в списке тоже:
string.Join(", ", strings);
вы можете переопределить метод ToString() вашего объекта:
public override string ToString ()
{
return string.Format ("{0},{1},{2}", this.number, this.id, this.whatever);
}