如何使用多维数组调用Parallel.ForEach

时间:2010-07-20 00:56:33

标签: c# multithreading concurrency parallel-extensions

我在弄清楚如何使用2D数组字符串调用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"}};

Parallel.ForEach(board, row =>
    {
        for (int i = 0; i < row.Length; ++i)
        {
            // find all valid sequences
        }
    });

如果我没有明确指定类型,我会收到以下错误:

  

方法的类型参数   “System.Threading.Tasks.Parallel.ForEach(System.Collections.Generic.IEnumerable,   System.Action)'不可能   从用法推断。尝试   指定类型参数   明确。

明确指定类型参数的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

问题在于二维数组不实现IEnumerable<one-dimensional-array>。 (它确实实现了IEnumerable,但它是IEnumerable字符串“扁平化”数组。)你可以做两件事:

  • string[,]更改为锯齿状阵列数组string[][]

  • 实现您自己的扩展方法,该方法迭代二维数组并将其转换为IEnumerable<one-dimensional-array>

答案 1 :(得分:3)

你仍然可以使用多维数组来完成这项工作,只需使用Parallel.For代替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
        }
    }
);