如何获得委托的这个工作示例示例将lambda语法作为参数传递?

时间:2009-04-16 15:57:34

标签: c# lambda

我正在尝试使用以下代码中的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;
}

my last question中,Jon Skeet向我指出了正确的方向,所以我可以得到一个例子(下面)做我想要的(传递一些方法名称,如上面的MessageBox.Show)。但问题是,要使它工作,我必须取出所有lambda语法(Action,Predicate等),这是我想要理解的。

有没有办法更改工作示例,以便它执行相同的功能,但使用lambda语法作为参数,如下面注释掉的行?

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 个答案:

答案 0 :(得分:2)

嗯,你可以做:

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)并传入数组,并返回结果”。

当你可以使用方法组时,这样做是没有意义的。

答案 1 :(得分:0)

Jon说的话(惊讶,惊讶!)

使用lambdas的全部意义在于动态创建函数,因此您不必静态声明它们。例如,

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

Aggreagte()是一种扩展方法(对于我使用的重载)获取种子值和函数。

首先将种子保存为累加器。然后,对于系列中的每个元素,它使用当前累加器和系列中的当前值调用给定函数,并将结果存储在累加器中(传递给下一个元素)。最终返回的值将作为整体结果返回。

换句话说,它与完全与手动滚动版本完全相同,除了它允许您传入'result'的初始值以及要调用的代码在循环中。