【问题标题】:Lambda expression to find greatest among 3 numbers在 3 个数字中找到最大的 Lambda 表达式
【发布时间】: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&lt;int, int, int, int&gt; greatestNumber = (x, y, z) =&gt; greaterNumber(x, greaterNumber(y, z));
  • 我在这里写了一些伪语句。但目标语言是 C#。 Anthony,根据您提供的表达式,greaterNumber() 需要一个定义。我只是在看是否可以在同一个 lambda 中定义更大的数字,而不是在外面定义它。
  • 相信你会失望的。确实,我希望你是!作为一项学术练习,我承认这非常有趣。对于你未来的编码,我希望你选择可读性而不是简洁的聪明。

标签: c# linq lambda


【解决方案1】:

这样的事情怎么样:

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

【讨论】:

  • 感谢您的写作 Joshua。但我的目的是探索 lambda 表达式的能力。当然,我们有 n 种方法可以找到最大数。同样,我的兴趣不是找到最大的数,我的兴趣是 lambda 表达式的能力。
【解决方案2】:

如何构建一个数组并使用 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 所说,创建一个数组可能有点矫枉过正,尽管它很短而且是单行的。您可以稍微简化一下您的表达式 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));

【讨论】:

  • 这对于这个问题来说有点矫枉过正。在您的系统中,您仍然只使用 3 个输入,但是您分配了一个新数组并执行了一些不必要的排序操作。
  • @Anthony 我看到你提到在第二个函数中编写第一个函数,只是在我编辑了我的答案之后。哎呀:-$
  • 没关系。我的只是一个评论,不是问题。
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多