在一行中使用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附加问题得到蟋蟀:)
为什么不简单:
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,则返回"?"之后的值。否则,将返回":"之后的值;