如何使用LINQ从通用列表中获取下一个适当的值?

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岁,他们可以在另一条小巷里设置它们. "

解开这个难题的关键是什么?

dot*_*tom 5

使用查询时,首先需要使用过滤条件,然后才调用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无序列表中使用的代码中,您立即过滤了初始列表.

在我提供的示例代码中,我使用延迟运算符来首先定义过滤器,然后我才使用立即函数来检索结果.