首页 > 解决方案 > 无法转换 WhereListIterator

问题描述

我想通过给定的 ID 列表过滤列表,该项目应该“在”

 // list is of type List<BaseModel>
 // so item is of type BaseModel
 // item.Id is of type ushort
 // filter.IdIn is of type List<ushort>

 List<BaseModel> filtered = (List<BaseModel>)
                  from item in list
                  where filter.IdIn.Contains(item.Id)
                  select item;

这会引发错误(我从德语翻译成英语 - 愚蠢的我用德语安装了 VisualStudio ..):

System.InvalidCastException:'
“WhereListIterator`1[JeffData.BaseModel]”类型的对象无法转换为
“System.Collections.Generic.List`1[JeffData.BaseModel]”'

按照这个答案,我尝试更改为

List<BaseModel> filtered = (List<BaseModel>)
                  from item in list
                  where filter.IdIn.ToList().Contains(item.Id)
                  select item;

List<BaseModel> filtered = (List<BaseModel>) list.Where(item =>  
                        filter.IdIn.ToList().Contains(item.Id)
                        );

// with or without ToList()

它都会抛出相同的错误。
当我不尝试将其投射到列表时,

var filtered = list.Where(item => filter.IdIn.Contains(item.Id));

没有抛出错误(因为它不会编译)并且filtered只是一个'WhereListIterator'并且我不能返回它

return filtered; // as a List<BaseModel>

取回 WhereListIterator 让我觉得我可能需要反过来做。不要检查 iffilter.IdIn.Contains(item.Id)而是检查 if item.Id is in/partof/memberof filter.IdIn,但这似乎不存在!?

所以归结为:我有一个具有超短 ID 的项目列表。我想找到 Ids 在 ushort Ids 列表中的项目。

标签: c#linq

解决方案


不确定 WhereListIterator (不确定这是否是翻译的一部分)

我希望 Where() 返回一个不会强制转换为列表的 IEnumerable。

不过,这就是 ToList() 将为您解析可枚举的地方。

var filtered = list.Where(item => filter.IdIn.Contains(item.Id)).ToList();

或者,如果您愿意:

var filtered = (from item in list
              where filter.IdIn.ToList().Contains(item.Id)
              select item).ToList();

推荐阅读