繁体   English   中英

lambda 表达式为简单 c#

[英]lambda expression to simple c#

嗨,我正在尝试更正代码,但遇到了 lambda 表达式。

addrow.Outcome1 = values.Where(row => DecompRowComparer(row, filterstring1))
                        .ToList()
                        .Sum(row => Convert.ToDouble(row[outcomeIndex]));

谁能帮我把这个表达式翻译成一个简单的 c# 代码。

我想检查 row[outcomeIndex] 是否只有一个字母,如果它只有一个字母并且是 a.(dot) 那么我想用 0 替换它,但我不知道该怎么做

row[outcomeIndex] 可以是数字,也可以是 a.(dot),这一行给出错误:输入字符串的格式不正确。 当 row[outcomeIndex] 为 a.(dot) 时,如何将这一行转换为简单的方式(多行)

这是不使用 Linq 的代码

double sum = 0;
foreach(var row in values)
{
    if(DecompRowComparer(row, filterstring1))
    {
        sum += Convert.ToDouble(row[outcomeIndex])
    }
}

addrow.Outcome1 = sum;

这是简单的 LINQ 代码。 将其转换为循环会复杂得多。 ToList()在这里是多余的,因为Sum适用于任何 IEnumerable。

而不是使用Convert.ToDouble使用double.TryParse ,它允许您控制如果解析失败会发生什么。

double.TryParse如果成功则返回 true,否则返回 false。 解析的双精度作为输出变量返回。 您可以将其与三元运算符结合使用,以在成功时返回解析值,或在失败时返回 0 或任何其他默认值。

三元运算符(condition)? trueExpression:falseExpression (condition)? trueExpression:falseExpression检查条件,如果条件为真则返回falseExpression的结果,如果为假则返回 falseExpression。

将两者放在一起:

var value=double.TryParse(someString,out var result) ? result : 0;

如果someString13解析成功并且result设置为13 如果它包含. ,解析失败, ?:表达式的第二个分支返回 0;

查询可以重写为:

addrow.Outcome1 = values.Where(row => DecompRowComparer(row, filterstring1))
                        .Sum(row=>double.TryParse(row[outcomeIndex],out var d)?d:0)

或者

addrow.Outcome1 = values.Where(row => DecompRowComparer(row, filterstring1))
                        .Select(row=>row[outcomeIndex])
                        .Sum(input=>double.TryParse(input,out var d)?d:0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM