Вопрос

У меня возникли небольшие проблемы с выяснением того, как вызвать 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.Резьба.Задачи.Параллель.ForEach(система.Коллекции.Общий.Бесчисленный, Система.Действие)" не может быть выведено из использования.Попробуй указание аргументов типа явно.

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

Это было полезно?

Решение

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

  • Измените string[,] к неровному массиву массивов, string[][].

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

Другие советы

Вы все еще должны быть в состоянии сделать эту работу с многомерным массивом, просто используя 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
        }
    }
);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top