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?

Foi útil?

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
        }
    }
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top