我有一个看起来像这样的代表:
public delegate byte[] CopyPixelOperation(byte[] pixel);
它允许我将一个任意操作注入到一个函数中,该函数循环并修改位图中的每个像素。以下是委托实现的示例:
CopyPixelOperation greenify = delegate(byte[] pixel)
{
int redValue = pixel[2];
int greenValue = pixel[1];
int blueValue = pixel[0];
pixel[1] += 10;
pixel[0] -= 10;
pixel[2] -= 10;
return pixel;
};
我对lambda表达式仍然有点不稳定,我不确定如何从表达式中引用数组的各个元素。可能吗?它是否有意义,或者我应该留下它是怎么回事?
答案 0 :(得分:4)
是的,你可以使用lambda表达式 - 但我个人可能不会。这似乎是编写方法的好地方:
public static byte[] Greenify(byte[] pixel)
{
int redValue = pixel[2];
int greenValue = pixel[1];
int blueValue = pixel[0];
pixel[1] += 10;
pixel[0] -= 10;
pixel[2] -= 10;
return pixel;
}
您可以在需要时使用方法组转换轻松创建与该方法相对应的委托:
CopyPixelOperation operation = Greenify;
或(作为方法调用参数):
var result = Apply(Greenify).Then(Save); // Or whatever
除非它类似于并行foreach或我真正需要捕获上下文的情况,否则我通常更喜欢使用长匿名函数的方法。
答案 1 :(得分:2)
delegate()
表达式和lambda在语法上并不完全不同。至少应该删除delegate
关键字并添加=>
运算符。您可以将您的委托表达为以下lambda:
CopyPixelOperation greenify = (byte[] pixel) =>
{
int redValue = pixel[2];
int greenValue = pixel[1];
int blueValue = pixel[0];
pixel[1] += 10;
pixel[0] -= 10;
pixel[2] -= 10;
return pixel;
};
为了进一步简化它,您可以省略参数类型,以便(byte[] pixel)
变为pixel
,其类型将从CopyPixelOperation
委托类型推断出来。
答案 2 :(得分:0)
据我所知,lambdas和代表几乎相同;除语法之外唯一的区别是lambdas可以隐式输入。这取决于你更具可读性:
CopyPixelOperation greenify = delegate(byte[] pixel)
{
int redValue = pixel[2];
int greenValue = pixel[1];
int blueValue = pixel[0];
pixel[1] += 10;
pixel[0] -= 10;
pixel[2] -= 10;
return pixel;
};
或
CopyPixelOperation greenify = pixel =>
{
int redValue = pixel[2];
int greenValue = pixel[1];
int blueValue = pixel[0];
pixel[1] += 10;
pixel[0] -= 10;
pixel[2] -= 10;
return pixel;
};
另请注意,CopyPixelOperation可以是
Func<byte[], byte[]>
(另请注意,您的方法会保存从不使用的值。)