Как вызвать Parallel.ForEach с многомерным массивом
-
17-09-2020 - |
Вопрос
У меня возникли небольшие проблемы с выяснением того, как вызвать 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
}
}
);
.