背景:我正试图写一个最短的lambda表达式来找到3个数字中的最大值。当然,ternery操作符可以做到这一点。
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来定义和使用最伟大的表达式本身中的两个数字中的较大的一个
不如这样写:
Func<int, int, int, int> greatest = (x, y, z) => Math.Max(x, Math.Max(y, z));
示例测试应用程序:
using System;
class Program
{
static void Main(string[] args)
{
Func<int, int, int, int> greatest = (x, y, z) => Math.Max(x, Math.Max(y, z));
Console.WriteLine(greatest(1, 2, 3));
Console.WriteLine(greatest(1, 3, 2));
Console.WriteLine(greatest(2, 1, 3));
Console.WriteLine(greatest(2, 3, 1));
Console.WriteLine(greatest(3, 1, 2));
Console.WriteLine(greatest(3, 2, 1));
}
}
如何建立一个数组和使用LINQ?可能比使用多个输入(未经测试)计算所有逻辑路径更容易扩展:
Func<int, int, int, int> f = (x, y, z) => new[] { x, y, z }.Max();
编辑:重新阅读这个问题,看起来你想递归greatestNumber
lambda,只有一个lambda定义。我认为你不能这么做,因为greatestNumber(x,y)
和greatestNumber(x,y,z)
的签名是不同的。您可能可以使用接受params
参数的普通函数做一些更通用的事情,但这不涉及lambda。
编辑2:正如@Anthony所说,创建一个数组可能是多余的,尽管它很短,只有一行代码。你可以简化表达式2:
Func<int, int, int> greaterOf = (x, y) => x > y ? x : y;
Func<int, int, int, int> greaterOf = (x, y, z) => greaterOf(x, greaterOf(y, z));