编写此linq lambda表达式并处理null的正确方法是什么?

时间:2019-07-14 16:53:29

标签: c# linq lambda

虽然这行得通,但我可以肯定地说,有一种更简洁(正确的方法)来编写该表达式。

    double currentPopulation = 0.0;
    if (detailmetrics.FirstOrDefault(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 &&
                                           dm.Timeframe.Equals("C")) != null)
    {
         currentPopulation = Convert.ToDouble(
             detailmetrics.FirstOrDefault(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 &&
                                          dm.Timeframe.Equals("C")
             ).MetricValue
         );
    }

4 个答案:

答案 0 :(得分:4)

简单

double currentPopulation = detailmetrics
    .Where(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 && dm.Timeframe.Equals("C"))
    .Select(a => Convert.ToDouble(a.MetricValue))
    .FirstOrDefault();

答案 1 :(得分:1)

将查询结果分配给一个临时变量,以避免对其进行两次评估。

var dm = detailmetrics.FirstOrDefault(
    dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 && dm.Timeframe.Equals("C")
);
if (dm != null) {
    currentPopulation = Convert.ToDouble(dm.MetricValue);
} else {
    currentPopulation = 0.0;
}

我不知道MetricValue的类型。例如,如果它是string,则可以使用(而不是if语句)将其写得更短:

currentPopulation = Convert.ToDouble(dm?.MetricValue ?? "0");

这意味着:如果dmnull,则取"0"(因为??左侧的表达式产生null),否则取{{ 1}},然后转换为dm.MetricValue

另请参阅:

答案 2 :(得分:0)

您可以将其缩短为:

var dm = detailmetrics.FirstOrDefault(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 && dm.Timeframe.Equals("C"));
if (dm != null) {
    currentPopulation = Convert.ToDouble(dm).MetricValue;
}

这样,您只需评估一次FirstOrDefault。

答案 3 :(得分:0)

很多为猫皮的方法,包括(为简洁起见,省略您的谓词):

currentPopulation = Convert.ToDouble(
    detailmetrics.FirstOrDefault(predicate)?.MetricValue ?? "0"
    );

以上假设MetricValue是一个为null或有效double的字符串,并且如果它为null,则希望得到0的结果。

如果您不想做这个假设,则可以编写自己的“安全”转换方法来处理null和无效值,例如:

currentPopulation = 
    SafeConvert(detailmetrics.FirstOrDefault(predicate)?.MetricValue);

public double? SafeConvert(string value)
{
    ... your implementation e.g. ...
    if (String.IsNullOrEmpty(value)) return null;
    if (Double.TryParse(value, ... out double result)) return result; 
    ... handle invalid double values ...
}