在一行中使用LINQ返回值或null

本文关键字:LINQ 返回值 null 一行 | 更新日期: 2023-09-27 18:27:48

我到处都有这样的语句。有没有办法在一行中完成这一切?也许C#6.0中的某些东西会有所帮助?我只想得到值,如果有什么,如果没有,那么返回一个空字符串或NULL。

var item = ll.Fields.Where(x => x.FieldTitle == "Loan Amount");
if (item.Count() != 0) {
    LatestItem.VelocifyLoanAmount = double.Parse(item.FirstOrDefault().Value);
}

第1版:它是一个双,尽管其他时候我需要得到一个字符串。我喜欢我的LINQ问题能如此迅速地得到帮助。我的Excel VSTO附加问题得到蟋蟀:)

在一行中使用LINQ返回值或null

为什么不简单:

var item = ll.Fields
    .Where(x => x.FieldTitle == "Loan Amount")
    .Select(x => (double?)double.Parse(x.Value))
    .FirstOrDefault();

您可以做的一件事是:

var item = ll.Fields.FirstOrDefault(x => x.FieldTitle == "Loan Amount")?.Value;
if (!double.TryParse(item, out LatestItem.VelocifyLoanAmount)
{
    // do your error case here
}

UPDATE:添加了C#6.0语法以缩短语法,并使用首选的TryParse进行错误检查。

UPDATE 2:如果出于某种原因double.Parse是首选(例如,如果包装器正在处理一段大代码的异常),这里有一个简短的示例。

LatestItem.VelocifyLoanAmount = 
    double.Parse(ll.Fields.FirstOrDefault(x => x.FieldTitle == "Loan Amount")?.Value);

您可以使用Select将集合中的对象投影到double?并返回FirstOrDefault

double? parsedFirstValueOrNull = ll.Fields
    .Where(x => x.FieldTitle == "Loan Amount")
    .Select(i => (double?)double.Parse(i.Value))
    .FirstOrDefault();

强制转换double?是必需的,否则FirstOrDefault将为空集合返回0.0,这可能是不明确的。

我到处都有这样的声明。

由于您要多次执行此操作,因此您可能希望提高效率,而不是减少行数。一种方法是一次将所有字段提取到Dictionary中,然后根据需要快速提取项目:

var fieldNames = new Set<string> {
    "Loan Amount", "Loan Balance", "Amount Due"
};
var dict = ll
    .Fields
    .Where(f => fieldNames.Contains(f.FieldTitle))
    .ToDictionary(f => f.FieldTitle, f => double.Parse(f.Value)); 
dict.TryGetValue("Loan Amount", out LatestItem.VelocifyLoanAmount);
dict.TryGetValue("Loan Balance", out LatestItem.VelocifyLoanBalance);
dict.TryGetValue("Amount Due", out LatestItem.VelocifyAmountDue);

您可以执行以下操作:

var item = ll.Fields.Where(x = > x.FieldTitle == "Loan Amount").FirstOrDefault();
return (item != null) ? item.Value : DefaultReturnValue;

返回使用三级运算符。第一个值是布尔值检查。如果布尔值为true,则返回"?"之后的值。否则,将返回":"之后的值;