Como chamar Parallel.ForEach com um array multidimensional
-
17-09-2020 - |
Pergunta
Estou tendo um pouco de dificuldade para descobrir como ligar para o Parallel.ForEach
com uma matriz 2D de strings:
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
}
});
Se eu não especificar o tipo explicitamente, recebo o seguinte erro:
Os argumentos de tipo para o método 'System.Threading.Tasks.parallel.ForEach (System.Collection.Genic.ienumerable, System.action)' não podem ser inferidos a partir do uso.Tente especificar os argumentos de tipo explicitamente.
Qual é a maneira correta de especificar explicitamente os argumentos de tipo?
Solução
O problema para você é que arrays bidimensionais não implementam IEnumerable<one-dimensional-array>
.(Ele implementa IEnumerable
, mas é um IEnumerable
de strings que "nivela" o array.) Você pode fazer duas coisas:
Mudar o
string[,]
para uma matriz irregular de matrizes,string[][]
.Implemente seu próprio método de extensão que itera sobre um array bidimensional e o transforma em um
IEnumerable<one-dimensional-array>
.
Outras dicas
Você ainda deve conseguir fazer isso funcionar com um array multidimensional, apenas usando Parallel.For
em vez de 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
}
}
);