Как вызвать Parallel.ForEach с многомерным массивом - PullRequest
3 голосов
/ 20 июля 2010

У меня небольшие проблемы с выяснением, как вызвать Parallel.ForEach с двумерным массивом строк:

string[,] board = new string[,]{
        {"A", "B", "C", "D", "E" },
        {"F", "G", "H", "I", "J"},
        {"K", "L", "M", "N", "O"},
        {"0", "1", "2", "3", "4"}};

Parallel.ForEach(board, row =>
    {
        for (int i = 0; i < row.Length; ++i)
        {
            // find all valid sequences
        }
    });

Если я не укажу тип явно, я получу следующую ошибку:

Аргументы типа для метода 'System.Threading.Tasks.Parallel.ForEach (System.Collections.Generic.IEnumerable, System.Action)' не могут быть получены из использования.Попробуйте указать аргументы типа явно.

Как правильно указать аргументы типа явно?

Ответы [ 2 ]

6 голосов
/ 20 июля 2010

Проблема для вас в том, что 2-мерные массивы не реализуют IEnumerable<one-dimensional-array>. (Он реализует IEnumerable, но это IEnumerable строк, которые «выравнивают» массив.) Вы можете сделать две вещи:

  • Измените string[,] на зубчатые массивы, string[][].

  • Реализуйте собственный метод расширения, который перебирает двумерный массив и превращает его в IEnumerable<one-dimensional-array>.

3 голосов
/ 20 июля 2010

Вы по-прежнему сможете выполнять эту работу с многомерным массивом, просто используя Parallel.For вместо Parallel.ForEach:

string[,] board = new string[,] {
    {"A", "B", "C", "D", "E" },
    {"F", "G", "H", "I", "J"},
    {"K", "L", "M", "N", "O"},
    {"0", "1", "2", "3", "4"}
};

int height = board.GetLength(0);
int width = board.GetLength(1);

Parallel.For(0, height, y =>
    {
        for (int x = 0; x < width; ++x)
        {
            string value = board[y, x];
            // do whatever you need to do here
        }
    }
);
...