虽然这行得通,但我可以肯定地说,有一种更简洁(正确的方法)来编写该表达式。
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
);
}
答案 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");
这意味着:如果dm
是null
,则取"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 ...
}