Есть несколько способов добиться этого, но я подозреваю, что правильный ответ - «это зависит». Ваш оригинальный пример для создания строки CSV использует оператор конкатенации строк; для этого рекомендуется использовать класс StringBuilder . А в .Net 4.0 появилась новая перегрузка для string.Join () , которая намного проще в использовании и понимании.
// .Net 3.5
var list = new List<int>{1,2,3};
var csv = list.Aggregate(new StringBuilder(),
(sb, i) => sb.Append(i).Append(','),
sb => { if (sb.Length > 0) sb.Length--; return sb.ToString(); });
// .Net 4.0
var csv1 = string.Join(",", list);
Если вы намереваетесь создать XML-документ, а не строку, тогда David B , ответ выше - хороший вариант:
var xml = new XElement("Root", list.Select(i => new XElement("ID", i)));
// <Root>
// <ID>1</ID>
// <ID>2</ID>
// <ID>3</ID>
// </Root>
Для создания строк XML я предпочитаю избегать явного кодирования открывающих и закрывающих тегов. В вашем примере было бы трудно получить неверное имя элемента "ID" при открытии или закрытии тегов, но я думаю об этом с точки зрения принципа СУХОЙ. Иногда я забывал изменить закрывающий тег для элемента, когда я изменил открывающий тег, например, в конфигурационных файлах. Использование XElement полностью устраняет эту проблему:
// .Net 3.5
var xml1 = list.Aggregate(new StringBuilder(),
(sb, i) => sb.Append(new XElement("ID", i)),
sb => sb.ToString());
// .Net 4.0
var xml2 = string.Join("", list.Select (i => new XElement("ID", i)));
// both xml1 & xml2 contain "<ID>1</ID><ID>2</ID><ID>3</ID>"
Производительность Aggregate () против string.Join () , string.Join () выигрывает каждый раз (с довольно ограниченным / базовым тестовым примером Я использовал).