【发布时间】:2016-02-18 05:31:43
【问题描述】:
我有一堂课:
public class CounselPoints
{
public int CounselNum { get; set; }
public String CounselPoint { get; set; }
public bool BR { get; set; }
public bool ICRVBS { get; set; }
}
...以及该类的通用列表:
List<CounselPoints> counselPoints = AYttFMConstsAndUtils.DeserializeCounselPointsFile();
我想从该通用列表中检索下一个适当的 CounselPoint,其逻辑可以用 SQL 表示,如下所示:
SELECT TOP 1 CounselNumber
FROM COUNSELPOINTSLU
WHERE BR IS TRUE
AND CounselNumber > @LastCounselPoint;
我调用此方法来尝试获取该值,然后像这样猛烈抨击它:
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);
}
在“英语”中,我想说的是,“给我第一个比传入的 arg (LastCounselPoint) 更大的数字并且 BR 为真的情况” p>
例如,如果我传入一个 17,并且 CounselNum val 为 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 );
我明白了:
错误 CS1061 'CounselPoints' 不包含 'Where' 的定义,并且找不到接受类型为 'CounselPoints' 的第一个参数的扩展方法 'Where'(您是否缺少 using 指令或程序集引用?)
...这也只会导致我告诉编译器,“除了九个,其他都下来了,pard;把它们放在另一条小巷里。”
解开这个难题的关键是什么?
【问题讨论】:
-
查看添加到我的答案中的改进...
标签: c# linq generics lambda generic-list