【问题标题】:How to cast returned value of XPathEvaluate?如何转换 XPathEvaluate 的返回值?
【发布时间】:2020-11-14 02:19:17
【问题描述】:

我正在尝试将 XPathEvaluate 方法的返回值转换为 IEnumerable。 此代码不起作用: var elements = (IEnumerable<XObject>) doc.XPathEvaluate(myXpath);

而且这种方法效果很好: var elements = ((IEnumerable<object>) doc.XPathEvaluate(myXpath)).Cast<XObject>();

有人可以解释一下区别吗?谢谢!

【问题讨论】:

    标签: c# linq linq-to-xml


    【解决方案1】:

    XPathEvaluate 在对象后面返回EvaluateIterator。

    不能直接转换为IEnumerable<XObject>。

    Cast 方法运行此迭代器并返回转换后的IEnumerable<XObject> 序列。

    【讨论】:

    • „它不能直接转换为 IEnumerable„那么为什么我能够将 EvaluateIterator 直接转换为 IEnumerable(我的问题中的第二个示例)或只是 IEnumerable?
    • @rkamx - 我看不到你的 xpath,所以我不知道返回了哪些节点。我假设有XElement。
    • 谢谢,看起来我把逆变误认为是协方差;)在第一个例子中,我试图将 IEnumerable(由 EvaluateIterator 返回)转换为 IEnumerable 和这是不可能的,因为 IEnumerable 是协变的(所以我不能直接将对象转换为 XObject)。我说的对吗?
    【解决方案2】:

    根据extension method XPathEvaluate,此方法返回一个object,它可以是布尔值、双精度值、字符串或IEnumerable。

    幸运的是,如果我们有类似对象的 IEnumerable 序列,我们可以将其转换为 IEnumerable<XObject>。

    如果您确定可枚举序列中的每个元素都是 XObject,则可以使用Enumerable.Cast<XObject>()。如果您认为某些对象可能属于另一种类型并且您想忽略其他类型,请使用Enumeable.OfType<XObject>

    object evaluatedDocument = doc.XPathEvaluate(myXpath);
    if (evaluatedDocument is IEnumerable enumerableSequence)
    {
        // the returned object implements IEnumerable
        IEnumerable<XObject> result = enumerableSequence.Cast<XObject>();
    
        // or:
        IEnumerable<XObject> result = enumerableSequence.OfType<XObject>();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多