Come chiamare Parallel.Fieach con un array multidimensionale
-
17-09-2020 - |
Domanda
Sto avendo un piccolo problema di capire come chiamare il Parallel.ForEach
con una serie 2D di stringhe:
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 non specifico il tipo esplicitamente ottenuto il seguente errore:
.Il tipo argomenti per il metodo 'System.Threading.tasks.parellel.Fieach (System.Collections.Generic.Inumerable, System.ation) 'non può essere dedotto dall'utilizzo.Provare Specifica degli argomenti del tipo esplicitamente.
Qual è il modo corretto per specificare gli argomenti del tipo esplicitamente?
Soluzione
Il problema per voi è che gli array 2-dimensionali non implementano IEnumerable<one-dimensional-array>
.(Implementa IEnumerable
, ma è un IEnumerable
di stringhe che "appiattisce" l'array.) Puoi fare due cose:
- .
-
Modificare il
string[,]
in un array di array frastagliati,string[][]
. -
Implementa il proprio metodo di estensione che itera su un array bidimensionale e lo trasforma in un
IEnumerable<one-dimensional-array>
.
Altri suggerimenti
Dovresti ancora essere in grado di fare questo lavoro con un array multidimensionale, solo usando Parallel.For
invece di 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
}
}
);
.