...所以我有这段代码:
foreach (var entry in list)
{
var marginOneEntry = otherList.FirstOrDefault(p => p.Margin == entry.Margin);
if (marginOneEntry == null) continue;
// Do stuff with marginOneEntry
}
和Resharper 5.1警告我在lambda表达式的compare-statement中使用entry
的“访问修改后的闭包”。是不是FirstOrDefault-call取消了这个问题?我的代码是坏的还是这个警告只是Resharper的一个缺点?
注意:我已经在SO上阅读了关于访问修改后的闭包的其他主题,但我想要对这个具体案例给出答案,并澄清Resharper是否对此主题过于敏感。
答案 0 :(得分:3)
我认为您在上面的代码中犯了一个错误。您的.Where(p => entry.Margin == 1)
前置条件不涉及要枚举的元素。你的意思是p.Margin == 1
吗?
此外,您只需撰写x.Where(y).FirstOrDefault()
。
x.FirstOrDefault(y)
答案 1 :(得分:3)
是的,这是Resharper中的一个问题,因为它没有区分具有延迟评估结果的方法和在延迟评估中不使用给定lambda的方法。 FirstOrDefault
不进行懒惰评估(忘记与'懒惰'相反的术语),因此在您的示例中使用它是安全的,但通常无法从方法的签名中理解它。