これを実現する方法はいくつかありますが、正解は「状況によって異なります」と思われます。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ドキュメントを作成することを意図している場合は、上記のDavidBの回答が適切なオプションです。
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」を正しく取得することは困難ですが、これはDRYの原則の観点から考えています。構成ファイルなどで開始タグを変更したときに、要素の終了タグを変更するのを忘れることがあります。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( )のパフォーマンスは、毎回勝ちます(私が使用したかなり限定された/基本的なテストケースで)。