我正在做一个项目,要求我使用一些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)来清理它
答案 0 :(得分:0)
您的variable1
是int
(一个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
并在x
和y
相等时返回它,否则它只是返回传入的原始值。然后您可以这样称呼它...
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)