c# - Linq 中的WhereSelectArrayIterator 是什么?

标签 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>

完全失败了。请帮忙。谢谢你们!

为了简单起见,我在没有 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/

相关文章:

c# - Visual C# 2008,读取 XML 文件并填充 listView

C# - 解析 Soap 响应以提取数据

ASP.net 运行 Thread 类 Foreground-Threads

python - 在 python 中解析 xml.gz 文件

c# - 通过c#解析xml时获取 "\/"等

c# - 如何阻止 Visual Studio 自动格式化代码的某些部分?

c# - File.AppendAllText 之后文件仍然打开

c# - 最小起订量 - 验证抛出异常

c# - 如何在不使用 HttpContext.Current 的情况下获取 ASP.NET Web 应用程序的物理位置?

java - 在 API 19 设备上膨胀 TextInputEditText 时出错