我有一个字符串数组。我正在尝试将它们写入一个元素。当我创建一个新元素时,它会按预期工作,而当我尝试 SetElementValue 时,它不会。任何帮助,将不胜感激。我什至不知道该查什么。
正常工作:
new XElement("tags", blog.tags.Select(x =>
new XElement("tag", PageUtilities.AddCDATAElements(PageUtilities.SanitizeXmlString(x)))))
Xml 文件中的结果:
<tags>
<tag><![CDATA[tag1]]></tag>
<tag><![CDATA[tag2]]></tag>
<tag><![CDATA[tag3]]></tag>
<tag><![CDATA[tag4]]></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>
完全失败了。请帮忙。谢谢你们!
为了简单起见,我在没有 AddCDATAElements 和 SanitizeXMLString 的情况下尝试了它,但结果仍然完全相同
xBlog.SetElementValue("tags", blog.tags.Select(x => new XElement("tag", x)));
System.Linq.Enumerable+WhereSelectArrayIterator`2[System.String,System.String]
最佳答案
在第一种情况下,您将 IEnumerable
传递到构造函数中,并且代码足够智能,可以弄清楚您在做什么并对其进行循环。我看了一下构造函数(使用 ReSharper),似乎如果您传递的是 IEnumerable,它会循环并为列表中的每个项目创建一个 XNode
。
在第二种情况下,您将 IEnumerable 传递给 SetElementValue
。但它不会检查参数是否是 IEnumerable。它会进行一些基本类型检查,看看它是否是字符串、整数等,最后它只调用 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
}
关于c# - Linq 中的WhereSelectArrayIterator 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20437664/