【问题标题】:How to call Parallel.ForEach with a multidimensional array如何使用多维数组调用 Parallel.ForEach
【发布时间】:2010-07-20 00:56:33
【问题描述】:

我在弄清楚如何使用二维字符串数组调用 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)' 不能 从用法推断。尝试 指定类型参数 明确的。

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

【问题讨论】:

    标签: c# multithreading concurrency parallel-extensions


    【解决方案1】:

    你的问题是二维数组没有实现IEnumerable&lt;one-dimensional-array&gt;。 (它确实实现了IEnumerable,但它是一个“扁平化”数组的字符串IEnumerable。)你可以做两件事:

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

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

    【讨论】:

    • @Link:另外,如果性能足够考虑并行化,那么无论如何您都希望使用锯齿状数组,因为它们更有效地进行索引。
    • @Brian Gideon:我认为这是一件很奇怪的事情。在适当的情况下(例如,在长时间运行的独立操作的情况下)并行化可以使性能发生显着的变化。出于性能原因将多维数组转换为锯齿状数组就是我所说的微优化。
    • @Dan:也许,但是索引 2D 锯齿状数组比索引多维数组快 3 倍。当然,如果索引不是算法中的主导因素,它对你的影响很小,但如果是的话,它可能会比并行化多维数组版本更快。无论哪种方式,它都很容易进行更改,并且对代码可读性或可维护性的影响非常小(如果有的话),以至于看起来几乎是显而易见的。当然,任何仍使您保持在同一个 Big-Oh 复杂性级别的优化都可以称为微优化...Parallel.For 包括在内。
    【解决方案2】:

    您应该仍然可以使用多维数组来完成这项工作,只需使用 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
            }
        }
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2014-01-18
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多