2009-11-01 79 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()每次(用相当有限的/基本测试胜我用过的情况)。