【问题标题】:Array.copy two lambdas, difficult with using the second in linqArray.copy 两个 lambda,很难在 linq 中使用第二个
【发布时间】:2011-10-15 14:06:33
【问题描述】:

我对下面的解释代码有很大的问题,同时我做了两个循环函数来做同样的事情。我将我的代码发送给朋友,告诉我是否可以更简单:) 所以我得到了类似的东西。

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. 上面的像素值为 255,上面 2 倍的像素值为 159
  4. 如果我发现该像素将该值更改为 172
  5. * 像素检查从第二行开始[0][1][2],并在最后一行之前完成,以便能够检查当前像素的上下像素*

我几乎了解上面的代码,但是我不明白开头的部分:

rooflimit + 1, 
myImageData, 
rooflimit + 1, 
floorlimit - rooflimit - 1);

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

【问题讨论】:

标签: c# arrays linq select lambda


【解决方案1】:

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

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

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

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

【讨论】:

  • 比较 Array.Copy() 和 Marshall.Copy() 会更好吗?
  • @Cooldown4seconds:不,我不这么认为。您不是出于互操作目的而尝试编组 - 您只是将一个数组的一部分复制到另一个数组中。
【解决方案2】:

我认为最好查看MSDN Array.Copy

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多