C# 如何让这个代理的工作示例将lambda语法作为参数传递?

C# 如何让这个代理的工作示例将lambda语法作为参数传递?,c#,lambda,C#,Lambda,我试图在下面的代码中创建一个我自己可以理解的示例,说明RelayCommand方法的作用: return new RelayCommand(p => MessageBox.Show("It worked.")); 构造函数是这样的: public RelayCommand(Action<object> execute, Predicate<object> canExecute) { if (execute == null) throw ne

我试图在下面的代码中创建一个我自己可以理解的示例,说明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;
}
public RelayCommand(操作执行,谓词canExecute)
{
if(execute==null)
抛出新的ArgumentNullException(“执行”);
_执行=执行;
_canExecute=canExecute;
}
在本文中,Jon Skeet为我指出了正确的方向,这样我就可以得到一个符合我要求的示例(如上面的MessageBox.Show所示,传递一些方法名)。但问题是,为了让它工作,我必须去掉所有lambda语法(动作、谓词等),这正是我试图理解的

是否有办法更改工作示例,使其执行相同的功能,但使用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;
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间TestLambda24
{
班级计划
{
静态void Main(字符串[]参数)
{
int[]数={6,3,7,4,8};
//WriteLine(“加法结果是{0}.”,Tools.ProcessNumbers(p=>Tools.AddNumbers,numbers));
WriteLine(“加法结果是{0}.”,Tools.ProcessNumbers(Tools.AddNumbers,numbers));
//WriteLine(“乘法结果是{0}.”,Tools.ProcessNumbers(p=>Tools.MultiplyNumbers,numbers));
WriteLine(“乘法结果是{0}.”,Tools.ProcessNumbers(Tools.MultiplyNumbers,numbers));
Console.ReadLine();
}
}
类工具
{
公共静态int ProcessNumbers(Func方法,int[]整数)
{
返回方法(整数);
}
公共静态int AddNumbers(int[]数字)
{
int结果=0;
foreach(整数i)
{
结果+=i;
}
返回结果;
}
公共静态整数倍数(整数[]数字)
{
int结果=1;
foreach(整数i)
{
结果*=i;
}
返回结果;
}
}
}
好吧,你可以:

换句话说,“给定一个数字数组,调用AddNumbers(或MultiplyNumbers)并传入该数组,然后返回结果”

但是,当你可以只使用方法组时,这样做是毫无意义的。

乔恩说的(惊喜,惊喜!)

使用lambdas的全部目的是动态创建函数,这样就不必静态声明它们。比如说,

Console.WriteLine(“Mult值为{0}”,Tools.ProcessNumbers(num=>num.Aggregate(1,(i,j)=>i*j),numbers));

Aggreagte()是一个扩展方法,它(对于我使用的重载)接受一个种子值和一个函数

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

换句话说,它的功能与手动版本完全相同,只是它允许您传入“result”的初始值以及要在循环中调用的代码

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