سؤال

أواجه مشكلة صغيرة في معرفة كيفية الاتصال بـ 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
        }
    });

إذا لم أحدد النوع بشكل صريح، أحصل على الخطأ التالي:

لا يمكن استنتاج نوع الوسائط الخاصة بـ Method 'System.Threading.tasks.paralled.foreach (system.collections.generic.ienumerable ، system.action) "من الاستخدام.حاول تحديد وسيطات النوع بشكل صريح.

ما هي الطريقة الصحيحة لتحديد وسيطات النوع بشكل صريح؟

هل كانت مفيدة؟

المحلول

المشكلة بالنسبة لك هي أن المصفوفات ثنائية الأبعاد لا يتم تنفيذها IEnumerable<one-dimensional-array>.(إنه ينفذ IEnumerable, ، لكنه IEnumerable من السلاسل التي "تسطح" المصفوفة.) يمكنك القيام بأمرين:

  • غير ال string[,] إلى مجموعة خشنة من المصفوفات، string[][].

  • قم بتنفيذ طريقة الامتداد الخاصة بك والتي تتكرر عبر مصفوفة ثنائية الأبعاد وتحولها إلى ملف IEnumerable<one-dimensional-array>.

نصائح أخرى

يجب أن تظل قادرًا على تنفيذ هذا العمل باستخدام مصفوفة متعددة الأبعاد، فقط باستخدام 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
        }
    }
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top