找不到查询模式的实现错误

Posted

技术标签:

【中文标题】找不到查询模式的实现错误【英文标题】:Could not find an implementation of the query pattern Error 【发布时间】:2012-04-06 01:14:35 【问题描述】:

给定

   var selectedItems = listBoxControl1.SelectedItems;
   var selectedItemsList = (from i in selectedItems
                             select i).ToList();

我收到错误

找不到源类型的查询模式的实现 'DevExpress.XtraEditors.BaseListBoxControl.SelectedItemCollection'。 未找到“选择”。考虑明确指定 范围变量“i”。

using system.LINQ完成

我可以使用foreach,所以它必须实现IEnumerable。如果可能的话,我更喜欢使用 LINQ 而不是 foreach 来收集每个字符串。

我想为列表框控件中的每个 SelectedItem 获取 ToString() 值并将它们粘贴到 List<string> 中。我该怎么做?

【问题讨论】:

对于一个 foreach 来处理关键字 in 之后的对象类型只需要一个名为 GetEnumerator() 的方法,它反过来返回一个类型的对象,该对象具有 MoveNext() 方法和一个当前财产。它确实不需要需要实现 IEnumerable 【参考方案1】:

我可以使用 foreach,所以它必须实现 IEnumerable。

这实际上不是真的,但在这里无关紧要。它确实实现了IEnumerable,但不是IEnumerable<T>,这是LINQ的工作原理。

实际上列表中有什么?如果它已经是字符串,您可以使用:

var selectedItemsList = selectedItems.Cast<string>().ToList();

或者如果它是“任何对象”并且你想调用ToString,你可以使用:

var selectedItemsList = selectedItems.Cast<object>()
                                     .Select(x => x.ToString())
                                     .ToList();

请注意,对 Cast 的调用是错误消息建议使用显式类型范围变量的原因 - 以 from Foo foo in bar 开头的查询表达式将转换为 bar.Cast&lt;Foo&gt;()...

【讨论】:

实现foreach需要什么? @P.Brian.Mackey:一种名为GetEnumerator() 的方法,它被声明为返回具有合适MoveNext()Current 成员的类型。它不必实现IEnumerable。使用具有(比如)intCurrent 属性的类型是在泛型之前迭代时避免装箱的一种方法。 只需登录即可上传此内容【参考方案2】:

要使 LINQ 工作,您需要一个 IEnumerable&lt;T&gt;,直接 IEnumerable 是不够的。试试:

var selectedItems = listboxControl1.SelectedItems.Cast<T> //where T is the actual type of the item

【讨论】:

【参考方案3】:

试试吧

var result = listBoxControl1.SelectedItems.Cast<MyItemType>().ToList();

【讨论】:

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

找不到源类型的查询模式的实现:反序列化服务响应时找不到选择

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

找不到源类型“System.Data.Entity.DbSet”的查询模式的实现

如何解决电脑出现 “找不到服务器或DNS错误”

apk 发布模式下 shared_prefrences 的颤振错误(在通道 plugins.flutter.io/shared_preferences 上找不到方法 getAll 的实现)

错误配置:找不到 XML 模式命名空间的 Spring NamespaceHandler