C# 如何让这个代理的工作示例将lambda语法作为参数传递?
我试图在下面的代码中创建一个我自己可以理解的示例,说明RelayCommand方法的作用: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
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();
}