【问题标题】:Enumerable.Where() not possible on IEnumerable?IEnumerable 上不可能 Enumerable.Where()?
【发布时间】:2015-03-16 10:06:52
【问题描述】:

我有一个 XmlNodeList 并想调用 .Where() 来获取过滤的节点列表。但这不起作用。现在我想知道,为什么有时 .Where() 有效而有时无效。我怎样才能让这段代码与 .Where() 一起运行?

XmlDocument doc = new XmlDocument();
doc.LoadXml(Xml);
var oTestNodes = doc.DocumentElement.ChildNodes.Where((item) => item.Name = "TestNode");

为了说明我的意思,这是可以执行相同操作的查询表达式:

var oTestNodes = from XmlNode oNode in doc.DocumentElement.ChildNodes
                 where oNode.Name = "TestNode"
                 select oNode;

【问题讨论】:

  • 不要只说“我不是在寻找这个”——告诉我们为什么您要拒绝这些选项。另外,不清楚为什么要将这些查询表达式放在括号中...
  • 这不是有效的 c# 代码。首先检查你的编译器错误。
  • 另请注意,当您说“Linq 解决方案”时,我认为您的意思是“查询表达式” - 直接调用 Where 方法仍在使用 LINQ,IMO...
  • 您所称的 LINQ 解决方案和您想要的(因为两者都是 LINQ 表达式)之间没有技术差异。前者只是另一种语法(所谓的查询语法),但两者都是LINQ。
  • 那么你应该编辑你的问题来解释这一点。没有解释的“我知道 X 会工作但我不想使用它”的问题非常令人沮丧——如果我们不知道为什么某个特定的解决方案被拒绝,我们就无法判断另一个解决方案是否会被拒绝.

标签: c# linq ienumerable


【解决方案1】:

大多数 LINQ to Objects 方法都适用于通用 IEnumerable<T> 类型,而不是 IEnumerable。不幸的是,XmlNodeList 只实现了IEnumerable

听起来您只是在寻找Cast,这是具有显式范围变量类型的查询表达式使用的(以及查询表达式编译的原因):

XmlDocument doc = new XmlDocument();
doc.LoadXml(Xml);
var oTestNodes = doc.DocumentElement.ChildNodes
                    .Cast<XmlNode>()
                    .Where(item => item.Name = 'TestNode');

如果可以的话,我个人建议使用 LINQ to XML 而不是 XmlDocument - 这是一个更好的 API。

【讨论】:

  • 谢谢!这就是我正在寻找的 :) 并感谢提示“LINQ to XML”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多