Cómo llamar a Paralelo.ForEach con una matriz multidimensional
-
17-09-2020 - |
Pregunta
Estoy teniendo un poco de problemas para averiguar cómo llamar a la Parallel.ForEach
con una matriz 2D de cadenas:
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
}
});
Si yo no especificar explícitamente el tipo me sale el siguiente error:
El tipo de argumentos para el método 'Sistema.Las operaciones de roscado.Tareas.En paralelo.ForEach(Del Sistema.Las colecciones.Genérica.IEnumerable, Sistema.Acción)' no se puede inferido a partir del uso.Trate de especificar el tipo de argumentos de forma explícita.
¿Cuál es la forma correcta para especificar el tipo de argumentos explícitamente?
Solución
El problema es que 2 dimensiones de las matrices no se implementan IEnumerable<one-dimensional-array>
.(No aplicar IEnumerable
, pero es un IEnumerable
de las cadenas que "aplana" la matriz.) Usted puede hacer dos cosas:
Cambiar el
string[,]
a una matriz escalonada de matrices,string[][]
.Implementar su propio método de extensión que itera a través de una matriz de dos dimensiones y la convierte en un
IEnumerable<one-dimensional-array>
.
Otros consejos
Usted debe ser capaz de realizar este trabajo con una matriz multidimensional, usando sólo Parallel.For
en lugar 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
}
}
);