Лямбда-выражение найти наибольшее среди 3 чисел - PullRequest
0 голосов
/ 15 апреля 2011

Справочная информация: я пытаюсь написать максимально короткое лямбда-выражение, чтобы найти наибольшее из 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 я смог каким-то образом достичь того, чего хотел, то есть определить функцию, чтобы найти большее из двух чисел из одного и того же выражения. Тем не менее, это устав лямбда.

Есть ли способ написать одну лямбду с подкладкой, чтобы определить и использовать большее из двух чисел из выражения самого великого.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Как насчет чего-то вроде:

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 голос
/ 15 апреля 2011

Как насчет построения массива и использования LINQ?Возможно, немного проще расширить, чем проработать все логические пути с несколькими входами (не проверено):

Func<int, int, int, int> f = (x, y, z) => new[] { x, y, z }.Max();

РЕДАКТИРОВАТЬ: Просто перечитайте вопрос, похоже, вы хотите повторить greatestNumber лямбда, столько одно лямбда-определение.Я не думаю, что вы могли бы сделать это, так как подпись greatestNumber(x,y) отличается от greatestNumber(x,y,z).Возможно, вы могли бы сделать что-то более обобщенное с обычной функцией, которая принимает аргумент params, но это не связано с лямбдами.

РЕДАКТИРОВАТЬ 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...