Как получить этот рабочий пример примера делегатов для передачи лямбда-синтаксиса в качестве параметра? - PullRequest
0 голосов
/ 16 апреля 2009

Я пытаюсь создать собственный понятный пример того, что делает метод RelayCommand в следующем коде:

return new RelayCommand(p => MessageBox.Show("It worked."));

конструктор это:

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
    if (execute == null)
        throw new ArgumentNullException("execute");

    _execute = execute;
    _canExecute = canExecute;
}

В мой последний вопрос Джон Скит указал мне правильное направление, чтобы я мог получить пример (ниже), который делает то, что я хотел (передать имя некоторого метода, как в MessageBox.Show выше). Но проблема в том, чтобы заставить его работать, мне пришлось убрать весь лямбда-синтаксис (действие, предикат и т. Д.), И это то, что я пытаюсь понять.

Есть ли способ изменить рабочий пример, чтобы он выполнял ту же функцию, но использовал лямбда-синтаксис в качестве параметра, как в закомментированных строках ниже?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestLambda24
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = { 6, 3, 7, 4, 8 };

            //Console.WriteLine("The addition result is {0}.", Tools.ProcessNumbers(p => Tools.AddNumbers, numbers));
            Console.WriteLine("The addition result is {0}.", Tools.ProcessNumbers(Tools.AddNumbers, numbers));

            //Console.WriteLine("The multiplication result is {0}.", Tools.ProcessNumbers(p => Tools.MultiplyNumbers, numbers));
            Console.WriteLine("The multiplication result is {0}.", Tools.ProcessNumbers(Tools.MultiplyNumbers, numbers));

            Console.ReadLine();
        }
    }

    class Tools
    {
        public static int ProcessNumbers(Func<int[], int> theMethod, int[] integers)
        {
            return theMethod(integers);
        }

        public static int AddNumbers(int[] numbers)
        {
            int result = 0;
            foreach (int i in numbers)
            {
                result += i;
            }
            return result;
        }

        public static int MultiplyNumbers(int[] numbers)
        {
            int result = 1;
            foreach (int i in numbers)
            {
                result *= i;
            }
            return result;
        }
    }

}

Ответы [ 2 ]

2 голосов
/ 16 апреля 2009

Ну, вы могли бы сделать:

static void Main(string[] args)
{
    int[] numbers = { 6, 3, 7, 4, 8 };

    Console.WriteLine("The addition result is {0}.",
        Tools.ProcessNumbers(p => Tools.AddNumbers(p), numbers));

    Console.WriteLine("The multiplication result is {0}.",
        Tools.ProcessNumbers(p => Tools.MultiplyNumbers(p), numbers));

    Console.ReadLine();
}

Другими словами, «учитывая массив чисел, вызовите AddNumbers (или MultiplyNumbers) и передайте в массив и верните результат».

Это довольно бессмысленно делать, когда вы можете просто использовать группу методов.

0 голосов
/ 06 августа 2009

Что сказал Джон (сюрприз, сюрприз!)

Весь смысл использования лямбд заключается в создании функций на лету, чтобы вам не приходилось объявлять их статически. Например,

Console.WriteLine("Mult value is {0}", Tools.ProcessNumbers(num => num.Aggregate(1, (i, j) => i*j), numbers));

Aggreagte () - это метод расширения, который (для использованной мной перегрузки) принимает начальное значение и функцию.

Он начинается с сохранения семени в качестве аккумулятора. Затем для каждого элемента в серии он вызывает данную функцию с накопителем тока и текущим значением в серии и сохраняет результат в накопителе (который будет передан следующему элементу). Окончательное возвращаемое значение возвращается как общий результат.

Другими словами, он точно делает то же самое, что и ваши версии, выпущенные вручную, за исключением того, что он позволяет вам передавать как начальное значение для «результата», так и код, который будет вызываться внутри петля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...