【发布时间】:2011-04-15 15:34:25
【问题描述】:
背景:我正在尝试编写一个最短的 lambda 表达式来找到 3 个数字中的最大值。 当然三元运算符也能做到。
Func<int, int, int, int> greatestNumber2 = (x, y, z) => (x > y) ? ((x > z) ? x : z) : ((y > z) ? y : z);
但我的意图是实现如下功能。
greatest (x, y, z) = if (greater (x, y)>z) then greater(x, y) else z;
我可以通过两种方式做到这一点。
Func<int, int, int> greaterNumber = null;
Func<int, int, int, int> greatestNumber = null;
//Expression 1
greaterNumber = (x, y) => x > y ? x : y;
greatestNumber = (x, y, z) => greaterNumber(x, y) > z ? greaterNumber(x, y) : z;
//Expression 2
greatestNumber = (x, y, z) => {
Func<int, int, int> greater = (i, j) => i > j ? i : j;
return greater(x, y) > z ? greater(x, y) : z;
};
在表达式 2 中,我能够以某种方式实现我想要的,即定义函数以从同一表达式本身中找到两个数字中的较大值。但是,它是一个语句 lambda。
有没有办法编写一个单行 lambda 来定义和使用最大自身表达式中的 2 个数字中的较大者。
【问题讨论】:
-
您可以编写较小的函数并在较大的函数中重用它,如下所示:
Func<int, int, int, int> greatestNumber = (x, y, z) => greaterNumber(x, greaterNumber(y, z)); -
我在这里写了一些伪语句。但目标语言是 C#。 Anthony,根据您提供的表达式,greaterNumber() 需要一个定义。我只是在看是否可以在同一个 lambda 中定义更大的数字,而不是在外面定义它。
-
相信你会失望的。确实,我希望你是!作为一项学术练习,我承认这非常有趣。对于你未来的编码,我希望你选择可读性而不是简洁的聪明。