C# - 在检查它们不等于null之后,试图将两个值除以并与另一个值进行比较的lambda表达式内部。似乎在lambda表达式中不起作用但在(我认为)是等效的foreach表达式中工作。通过工作,我的意思是测试数据都不满足表达式; foreach代码的行为表示这一点(foreach代码执行后找到的值仍为false,但是,lambda表达式中的列表将在代码执行后包含元素)。我是lambda和linq表达式的新手,这里发生了什么?
linq表达式如下:
IEnumerable<DataModel> list = dataList.Where(t => t.A != null
&& t.B != null
&& t.Compute1.Value.CompareTo((t.B.Value / t.A.Value)) != 0);
这适用于以下foreach声明:
var found = false;
foreach (var data in dataList)
{
if (data.A == null || data.B == null )
{
continue;
}
var value = (double)data.B.Value / data.A.Value;
if (data.Compute1.Value.CompareTo(value) != 0)
{
found = true;
}
}
更新:我通过将t.Compute1,t.A和t.B强制转换来解决此问题,即使VS告诉我强制转换。
答案 0 :(得分:1)
那些不是等同的代码片段。 foreach循环在找到A或B为空的数据元素时停止搜索。即使前一个元素具有A == null或B == null,lambda也会检查所有元素。最接近的foreach等价物是用continue替换break。
var found = false;
foreach (var data in dataList)
{
if (data.A == null || data.B == null )
{
continue;
}
var value = (double)data.B.Value / data.A.Value;
if (data.Compute1.Value.CompareTo(value) != 0)
{
found = true;
}
}