什么是Linq的WhereSelectArrayIterator?

时间:2013-12-07 04:38:44

标签: c# asp.net xml linq

我有一个字符串数组。我正在尝试将它们写入元素。当我创建一个新元素时,它按照预期的方式工作,当我尝试SetElementValue时,它不会。任何帮助,将不胜感激。我甚至不知道该怎么看。

正常工作:

new XElement("tags", blog.tags.Select(x =>
    new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x)))))

Xml文件中的结果:

<tags>
  <tag>&lt;![CDATA[tag1]]&gt;</tag>
  <tag>&lt;![CDATA[tag2]]&gt;</tag>
  <tag>&lt;![CDATA[tag3]]&gt;</tag>
  <tag>&lt;![CDATA[tag4]]&gt;</tag>
</tags>

当我尝试更新时出现问题:

不工作:

xBlog.SetElementValue("tags", blog.tags.Select(x =>
    new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x)))));

结果:

<tags>System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]</tags>

完全亏损。请帮忙。谢谢你们!

对于Simplicity我尝试了没有AddCDATAElements和SanitizeXMLString但仍然完全相同的结果

xBlog.SetElementValue(“tags”,blog.tags.Select(x =&gt; new XElement(“tag”,x)));

System.Linq.Enumerable + WhereSelectArrayIterator`2 [System.String,System.String]

3 个答案:

答案 0 :(得分:3)

在第一种情况下,您将IEnumerable传递给构造函数,代码足够聪明,可以弄清楚您正在做什么并在其上循环。我看了一下构造函数(使用ReSharper),看来如果你传递的是IEnumerable,它会循环并为列表中的每个项创建一个XNode

在第二种情况下,您将IEnumerable传递给SetElementValue。但它不会检查参数是否为IEnumerable。它执行一些基本类型检查以查看它是否为字符串,int等,最后它只调用ToString,在您的情况下,它返回由blog.tags.Select(x => ...)生成的变量类型的名称

首先将结果存储在列表中,然后循环应该可以解决问题,但是我不知道你想对列表中的每个项目做什么。

var elements = blog.tags.Select(x =>
    new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x))))

foreach (var element in elements)
{
    // do something with each element
}

答案 1 :(得分:0)

选择将始终返回可枚举的项目。看起来SetElementValue只会对该参数的值执行ToString()。如果您想要单个元素的值,请在.Select()之后使用.First()。Value。如果你想要所有这些,你可能需要添加更多代码来生成多个元素并将它们添加到值中。

答案 2 :(得分:0)

不太确定您的数据是什么,但是您是否尝试在linq之后添加ToList()ToArray()?这将使可枚举成为。