可以而且应该将一个修改字节数组的委托转换为Lambda表达式吗?

时间:2011-10-08 18:24:53

标签: c# .net lambda

我有一个看起来像这样的代表:

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表达式仍然有点不稳定,我不确定如何从表达式中引用数组的各个元素。可能吗?它是否有意义,或者我应该留下它是怎么回事?

3 个答案:

答案 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[]>

(另请注意,您的方法会保存从不使用的值。)