Comment appeler en Parallèle.ForEach avec un tableau multidimensionnel
-
17-09-2020 - |
Question
Je vais avoir un peu de mal à trouver comment appeler la Parallel.ForEach
avec un tableau 2D de chaînes de caractères:
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 je ne spécifie pas le type explicitement j'obtiens l'erreur suivante:
Le type des arguments de la méthode 'Système.Le filetage.Les tâches.En parallèle.ForEach(Système D'.Les Collections.Génériques.IEnumerable, Système.Action)' ne peut pas être inférée à partir de l'utilisation.Essayez spécifier les arguments de type explicitement.
Quelle est la bonne manière de spécifier le type des arguments de façon explicite?
La solution
Le problème pour vous est que le 2-dimensions des tableaux de ne pas mettre en œuvre IEnumerable<one-dimensional-array>
.(Il n'mettre en œuvre IEnumerable
, mais c'est une IEnumerable
de chaînes qui "aplatit" le tableau.) Vous pouvez faire deux choses:
Modifier la
string[,]
pour un tableau en escalier de tableaux,string[][]
.Mettre en place votre propre méthode d'extension qui effectue une itération sur un tableau à deux dimensions et il se transforme en un
IEnumerable<one-dimensional-array>
.
Autres conseils
Vous devriez toujours être en mesure de faire ce travail avec un tableau multidimensionnel, en utilisant seulement Parallel.For
au lieu 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
}
}
);