在 IEnumerable<T> 上找不到查询模式的实现

Posted

技术标签:

【中文标题】在 IEnumerable<T> 上找不到查询模式的实现【英文标题】:Could not find an implementation of the query pattern on IEnumerable<T> 【发布时间】:2012-10-14 06:31:45 【问题描述】:

我有一个IEnumerable&lt;T&gt; 作为方法的参数,其中T 是一个结构类型:

using System;
using System.Collections.Generic;
using System.Linq;
using ...

public static class Foo

    internal struct CellDiff
    
        public int RefX;
        public int RefY;
        public object OldValue;
        public object NewValue;
    

    private static void ItemChanged(IEnumerable<CellDiff> diffs, int cellX, int cellY)
    
        var change = from CellDiff diff in diffs
                     where diff.RefX == cellX && diff.RefY == cellY
                     select diff;

        ...
    

这会导致以下错误:

(参数)IEnumerable&lt;CellDiff&gt; diffs

错误: 找不到源类型“CellDiff”的查询模式的实现。 'Where' 未找到。

我也尝试过diffs.AsQueryable(),但无济于事。

我在IEnumerable&lt;T&gt; 上进行 LINQ 查询通常没有问题。我对这里发生的事情有点迷茫。

【问题讨论】:

您确定错误出现在代码的那部分吗?除了查询变量上的冗余类型之外,它似乎很好 我刚刚尝试了您的代码并且它工作正常。似乎错误在其他地方。 @RuneFS 100% 确定。如果我添加类型,则会出现错误,如果我删除它,错误就会消失。 您是否在 select 或 Cast 上实现了自己的扩展方法? 这是什么版本的 .NET / 编译器?还加载了哪些其他库?我想知道另一个库是否正在将内容添加到 System.Linq 或“...”中的另一个命名空间中 【参考方案1】:

在 LINQ 查询语法中指定类型会使用该类型参数创建对 Cast 扩展方法的调用。

您是否在某处定义了自己的Cast

【讨论】:

【参考方案2】:

您需要更改查询,更新一个是这样的

 var change = from diff in diffs //changed like removed "CellDiff" from this
                     where diff.RefX == cellX && diff.RefY == cellY
                     select diff;

在你查询之后不需要CellDiff

【讨论】:

为什么会这样?我确定我之前已经包含了该类型并且从未遇到过问题。 @Polynomial - 好吧,我从来没有通过在您的查询中包含类型来编写查询......但我认为没有必要包含类型 @Polynomial 它不应该是类型是多余的,因此没有语义差异 @both 添加类型会增加对.Cast&lt;TWhatever&gt;()的调用,因此在这种情况下,它并不是真正需要的。 这不重要;翻译应该是相同的。包括它不是必需的,但不应破坏它。

以上是关于在 IEnumerable<T> 上找不到查询模式的实现的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?

在 C# 中将多个 IEnumerable<T> 提要混合为一个

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

IEnumerable<T>是啥意思?

IEnumerable<T> 使用 c# 在函数内访问 T 的属性

将 IEnumerable<T> 转换为 List<T>