Lambda表达式在3个数字中找到最大值

时间:2011-04-15 00:38:55

标签: c# linq lambda

背景:我正在尝试编写一个尽可能短的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来定义和使用最大的表达式中的2个数字中的较大数字。

2 个答案:

答案 0 :(得分:3)

如何处理以下内容:

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));
    }
}

答案 1 :(得分: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参数的普通函数做一些更通用的事情,但这不涉及lambdas。

编辑2:正如@Anthony所说,创建一个阵列可能有点过头了,虽然它很短而且是一个单行。您可以稍微简化Expression 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));