Array.copy две лямбды, сложно с использованием второй в linq - PullRequest
0 голосов
/ 15 октября 2011

У меня большая проблема с кодом объяснения, в то время как я сделал функцию с двумя циклами, которая делает то же самое. Я отправляю свой код другу, чтобы сказать, можно ли сделать его проще :) Так что я получаю нечто подобное.

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. Пожалуйста, измените тему, если она не очень хорошо указана.

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Последние четыре параметра являются последними параметрами Array.Copy. Ваш код будет более понятным, если вы разделите его:

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

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

Мне бы очень хотелось использовать здесь отдельный метод вместо лямбда-выражения - на самом деле он слишком сложен, чтобы его можно было прочитать.

1 голос
/ 15 октября 2011

Я думаю, что лучше посмотреть MSDN Array.Copy для этого:

Копирует диапазон элементов из массива, начиная с указанного индекс источника и вставляет их в другой массив, начиная с Указанный целевой индекс. Длина и индексы указаны как 32-разрядные целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...