在lambda表达式内部试图划分两个值并与另一个值进行比较

时间:2015-01-22 15:20:51

标签: c# linq lambda

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告诉我强制转换。

1 个答案:

答案 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;
    }
}