Array.copy两个lambdas,在linq中使用第二个很困难

时间:2011-10-15 14:06:33

标签: c# arrays linq select lambda

我的解释代码有很大的问题,同时我做了两个循环功能,做同样的事情。我把我的代码发送给朋友,告诉我是否可以简化:)所以我得到类似的东西。

Array.Copy(
    myImageData
        .Select(
            (b, index) =>
                (
                    index > rooflimit && index < floorlimit && b == 252 &&
                    (myImageData[index + width] == 0 || (myImageData[index + width] > 168 && myImageData[index + width] < 173)) &&
                    myImageData[index - width] == 252 &&
                    myImageData[index - (2 * width)] == 159
                ) ? (byte)172 : b
        ).ToArray(),
    rooflimit + 1,
    myImageData,
    rooflimit + 1,
    floorlimit - rooflimit - 1
);

我的循环正在做类似的事情(上面做同样的事情):

  1. 当你获得所有像素时,将它们复制到字节数组
  2. 找到值为255,像素低于0或者范围为168-173
  3. 的所有像素
  4. 上面的像素具有值255并且上面的像素2倍具有值159
  5. 如果我发现像素将该值更改为172
  6. *像素检查从第二行 [0] [1] [2]开始,并在最后一行之前完成,以便能够检查当前像素上方和下方的像素* < /强>
  7. 我几乎得到了上面的代码,但是我不理解那个以:

    开头的部分
    rooflimit + 1, 
    myImageData, 
    rooflimit + 1, 
    floorlimit - rooflimit - 1);
    

    所以我请你帮忙,谢谢! PS。如果指定不好,请更改主题。

2 个答案:

答案 0 :(得分:2)

最后四个参数是Array.Copy的最后一个参数。如果将其拆分,您的代码会更清晰:

byte[] tmp = myImageData.Select([... big lambda expression ...])
                        .ToArray();

Array.Copy(tmp, rooflimit + 1, 
           myImageData, rooflimit + 1,
           floorlimit - rooflimit - 1);

我也很想在这里使用一个单独的方法而不是一个lambda表达式 - 它太复杂了,不可读,真的。

答案 1 :(得分:1)

我认为最好先看MSDN Array.Copy

  

从指定的范围开始复制Array中的一系列元素   源索引并将它们粘贴到另一个数组开始   指定的目标索引。指定长度和索引   作为32位整数。