此Lambda代码有问题,未在所有情况下都返回值

时间:2019-01-30 03:11:25

标签: c# lambda delegates

我正在做一个项目,要求我使用一些Lambda。我正在尝试创建一个将有两个字符串和一个int插入其中的字符串,如果两个字符串相同,则为int ++。这是我的代码:

DelegateName tally = (x, y, z) => { if (x == y) z++; };

我知道不是所有的代码路径都返回一个值,但是我不确定该朝哪个方向修复它。如果x字符串与y字符串相同,则我实际上将运行12次以将计数添加到12个变量之一中。它计算匹配字符串的数量,并将其添加到适当的变量(int)

这是我要用lambda替换的代码:

if (cellValue.ToString().Substring(0, 1) == "1")
                {
                    variable1++;
                }

希望通过调用tally(cellValue.ToString()。SubString(0,1),1,variable1)来清理它

2 个答案:

答案 0 :(得分:0)

您的variable1int(一个Value type),因此当您将其作为参数传递时,实际上是传递了它的值,因此在tally lambda内将有另一个 int变量z,它独立于variable1。因此,当您在z++内进行tally时,您的variable1不会改变。

如果您的tally是在variable1附近定义的,则可以在lambda中使用它:

var variable1 = 0;
DelegateName tally = (x, y) => { if (x == y) variable1++; };

foreach (var cellValue in cells)
     tally(cellValue.ToString().SubString(0,1), "1");

另一种方法是LINQ

using System.Linq;

var variable1 = cells.Select(c => c.ToString().FirstOrDefault()).Count(c => c == '1');
// or even better (thx @RufusL)
var variable2 = cells.Count(c => c.ToString().StartsWith("1"));

答案 1 :(得分:0)

将lambda视为常规方法的简写。您提供的Lambda:

(x, y, z) => { if (x == y) z++; }

翻译为:

void IncrementIfEqual(string x, string y, int z)
{
    if (x == y) z++;
}

(Lambda没有方法名称,因此我只是随机地调用方法IncrementIfEqual)。您不会从方法内部返回任何值,因此该方法将返回void。另外,您传入的参数z在该方法内部递增,但对传入的原始变量的值没有任何影响。例如,如果您调用的方法是这样编写的。

IncrementIfEqual(cellValue.ToString().Substring(0, 1), "1", variable1)

然后,变量1将在调用后保持相同的值,因为该方法增加了参数z的值,该参数在方法外部不存在。您可以这样编写方法...

int IncrementIfEqual(string x, string y, int z)
{
    return (x == y) ? ++z : z;
}

递增值z并在xy相等时返回它,否则它只是返回传入的原始值。然后您可以这样称呼它...

variable1 = IncrementIfEqual(cellValue.ToString().Substring(0, 1), "1", variable1)

在这种情况下,您想要的lambda表达式就是这个...

(x, y, z) => { return (x == y) ? ++z : z; }

我不确定DelegateName是什么,但是如果它具有Invoke()方法,则您的全部用法可能是这样的...

DelegateName tally = (x, y, z) => { if (x == y) z++; };
variable1 = tally.Invoke(cellValue.ToString().Substring(0, 1), "1", variable1)