2009-11-01 73 views
0

我用這個在過去建立逗號分隔的列表:使用linq集合函數來構建xml字符串?

var list = new List<int>{1,2,3}; 
var retVal = list.Select(i=>i.ToString()).Aggregate((a,b) => a+", "+b); 

的偉大工程。

我試圖做同樣的事情'包裝'每個元素作爲一個XML節點。

喜歡的東西:

Aggregate((a, b) => string.Format("<ID>{0}</ID><ID>{1}</ID>", a,b)) 

不能完全似乎使它雖然工作。可能嗎?還是有一個更簡單的方法完全?

謝謝。

回答

2

它不應該是這樣:

Aggregate((a, b) => string.Format("{0}<ID>{1}</ID>", a,b)) 

你加入a新節點。

3

Blindy的回答肯定會的工作,但我個人使用:

var list = new List<int> {1, 2, 3}; 
var joined = string.Join("", list.Select(x => "<ID>" + x + "</ID>") 
           .ToArray()); 

我個人認爲更容易閱讀和理解比聚集。我相信它也會更有效率 - 儘管這隻對大名單纔有意義。

3

還是有一個更簡單的方法完全?

List<int> list = new List<int>{1, 2, 3}; 
var xmlNodes = list.Select(i => new XElement("ID", i)); 
XElement xml = new XElement("Data", xmlNodes); 
Console.WriteLine(xml); 
0

有許多的方式來實現這一點,但我懷疑,正確答案是「看情況」。您創建CSV字符串的原始示例使用字符串連接運算符;推薦的方法是使用StringBuilder類來實現此目的。在.Net 4.0中,字符串有一個新的過載。加入()方法使用和理解起來很簡單。

如果你的目的是要創建一個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」不正確,但我認爲這是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>" 

骨料()的性能的string.join()的string.join()每次(用相當有限的/基本測試勝我用過的情況)。