كيفية استدعاء Parallel.ForEach مع مجموعة متعددة الأبعاد
-
17-09-2020 - |
سؤال
أواجه مشكلة صغيرة في معرفة كيفية الاتصال بـ 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
}
}
);