B. *_*non 1 c# linq generics lambda generic-list
我有一节课:
public class CounselPoints
{
public int CounselNum { get; set; }
public String CounselPoint { get; set; }
public bool BR { get; set; }
public bool ICRVBS { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......以及该类的通用列表:
List<CounselPoints> counselPoints = AYttFMConstsAndUtils.DeserializeCounselPointsFile();
Run Code Online (Sandbox Code Playgroud)
我想从该通用列表中检索下一个适当的CounselPoint,其逻辑可以用SQL表示,如下所示:
SELECT TOP 1 CounselNumber
FROM COUNSELPOINTSLU
WHERE BR IS TRUE
AND CounselNumber > @LastCounselPoint;
Run Code Online (Sandbox Code Playgroud)
我把这种方法称为试图获得该值,并且像这样挥舞着它:
public static int GetNextBibleReadingCounselPoint(int LastCounselPoint)
{
List<CounselPoints> counselPoints = AYttFMConstsAndUtils.DeserializeCounselPointsFile();
return counselPoints.FirstOrDefault(i => i.CounselNum).Where(j => j.BR).Where(k => k.CounselNum > LastCounselPoint);
}
Run Code Online (Sandbox Code Playgroud)
在"英语"中,我试图说," 给我第一个比传入的arg(LastCounselPoint)更大数量的CounselNum,以及BR是真的 "
例如,如果我传入17,并且CounselNum值为18的counselPoint"记录"也将BR设置为true,则应该返回18.简单,不是吗?
但是我显然是可怕的,或者至多是尴尬的尝试,甚至都没有编译; 我明白了:
错误CS0029无法将类型'int'隐式转换为'bool'
...和:
错误CS1662无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
我不知道为什么它认为我试图转换为bool,我绝对不会理解第二个错误.
如果我将代码更改为:
return counselPoints.FirstOrDefault(i => i.CounselNum > LastCounselPoint).Where(j => j.BR).Select(k => k.CounselNum );
Run Code Online (Sandbox Code Playgroud)
我明白了:
错误CS1061'CounselPoints'不包含'Where'的定义,也没有扩展方法'Where'可以找到接受类型'CounselPoints'的第一个参数(你是否缺少using指令或汇编引用?)
...这也只会让我告诉编译器," 所有人都只有9岁,他们可以在另一条小巷里设置它们. "
解开这个难题的关键是什么?
使用查询时,首先需要使用过滤条件,然后才调用FirstOrDefault:
return counselPoints
.Where(j => j.BR)
.Where(k => k.CounselNum > LastCounselPoint)
.Select(i => i.CounselNum)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
有两种类型的LINQ查询运算符 - immediate和deferred.Where是延迟算子的例子,FirstOrDefault是直接的操作者.
在FirstOrDefault无序列表中使用的代码中,您立即过滤了初始列表.
在我提供的示例代码中,我使用延迟运算符来首先定义过滤器,然后我才使用立即函数来检索结果.