无法将System.Collections.Generic.IEnumerable'转换为'System.Collections.Generic.List

时间:2018-09-25 17:12:32

标签: c#

我有此代码:

List <PhraseAndScore> ps = db2.Query<PhraseAndScore>(select).ToList();
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false);

我希望psNoHidden给我ps的内容,但其中Hidden属性为false。当我编译时,给出了这个错误。是因为我做.ToList()太早还是做得正确而应该做其他事情?

  

错误CS0266:无法隐式转换类型   System.Collections.Generic.IEnumerable<Japanese.PhraseAndScore>至   System.Collections.Generic.List<Japanese.PhraseAndScore>。一个   存在显式转换(您是否缺少演员表?)(CS0266)

2 个答案:

答案 0 :(得分:7)

ToList()调用之后添加对Where(...)方法的调用,例如:ps.Where(x => x.Hidden == false).ToList();

Where()将返回一个IEnumerable对象,该对象可以是列表,也可以不是列表:编译器不知道它是否为List,因此会在以下位置引发错误:您。调用ToList()可确保IEnumerable为您转换为List

答案 1 :(得分:3)

ToList上调用IQueryable时,您正在将数据具体化到进程存储器中。您可以使用两种可能的解决方案来解决错误:

List <PhraseAndScore> ps = db2.Query<PhraseAndScore>(select).ToList();
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false).ToList();

var ps = db2.Query<PhraseAndScore>(select);
List<PhraseAndScore> psNoHidden = ps.Where(x => x.Hidden == false).ToList();

在第二种情况下,您的Where调用将被转移到数据库并转换为SQL where子句