إنشاء دوال Map
و Reduce
في C#: دليل شامل
في عالم البرمجة الوظيفية، تمثل دوال Map
و Reduce
أدوات قوية لتحويل وتجميع البيانات. إذا كنت معتادًا على لغات مثل Lisp، قد تتساءل كيف تحقق وظائف مشابهة في C#. في هذه المقالة، سنستكشف كيفية إنشاء توسيعات Map
و Reduce
عامة للقوائم في C#، مما يساعدك على كتابة كود أنظف وأكثر أناقة.
الحاجة إلى Map و Reduce
عند العمل مع القوائم في C#، فإن عمليات مثل تحويل كل عنصر أو تجميع العناصر تعتبر مهام شائعة. تقليديًا، قد يعتمد المطورون على حلقات foreach
المطولة، مما يؤدي إلى كود قد يكون مزدحمًا وصعب القراءة. هنا تأتي فكرة إنشاء طرق Map
و Reduce
في العمل—السماح بإجراء العمليات بشكل مختصر وبأسلوب وظيفي.
تنفيذ Reduce
فهم دالة Reduce
تستخدم دالة Reduce
قائمة، تطبق عملية محددة لتجميع عناصرها، وتعود بنتيجة واحدة. إليك نظرة سريعة على التنفيذ:
public delegate R ReduceFunction<T, R>(T t, R previous);
public static R Reduce<T, R>(this List<T> list, ReduceFunction<T, R> r, R initial)
{
var aggregate = initial;
foreach (var t in list)
aggregate = r(t, aggregate);
return aggregate;
}
تفصيل التنفيذ
-
إعلان المفوضة: تعرّف مفوضة
ReduceFunction
توقيع طريقة تأخذ عنصرًا من النوعT
ومجمعًا من النوعR
، وتعيد مجمعًا جديدًا من النوعR
. -
توقيع الطريقة: تُعلن طريقة
Reduce
كطريقة توسيع لـList<T>
. تتطلب وظيفة تتوافق مع مفوضةReduceFunction
وقيمة أولية. -
حلقة التجميع: داخل الطريقة، نقوم بالتكرار عبر كل عنصر في القائمة وتطبيق الدالة المخفضة. يتراكم النتيجة عبر كل تكرار حتى تتم معالجة القائمة بالكامل.
تنفيذ Transform
فهم دالة Transform
تتيح لك دالة Transform
تطبيق إجراء معين على كل عنصر في القائمة. إليك كيف تبدو:
public delegate void TransformFunction<T>(T t, params object[] args);
public static void Transform<T>(this List<T> list, TransformFunction<T> f, params object[] args)
{
foreach (var t in list)
f(t, args);
}
تفصيل التنفيذ
-
إعلان المفوضة: تشير مفوضة
TransformFunction
إلى إجراء يقبل عنصرًا من النوعT
ومصفوفة اختيارية من المعاملات الإضافية. -
توقيع الطريقة: مشابه لطريقة
Reduce
، تُعرّفTransform
كطريقة توسيع لـList<T>
. تطبق الإجراء المقدم على كل عنصر. -
التطبيق التكراري: من خلال حلقة، يتم تطبيق الإجراء على كل عنصر في القائمة، مما قد يبسط كودك من خلال القضاء على الفحوصات الشرطية المتكررة.
المقارنة بالطرق المدمجة في LINQ
بينما تقلد تنفيذ Map
و Reduce
بعض جوانب البرمجة الوظيفية، من المهم النظر في الوظائف الحالية في C#. أدوات مثل LINQ تقدم طرقًا مدمجة قد تخدم أغراضًا مشابهة:
- دالة Aggregate: توفر هذه الطريقة وسيلة لتجميع القيم بنفس الطريقة التي تفعلها طريقتنا
Reduce
. - طريقة ForEach: يمكن أن تحقق هذه التوسعة LINQ نتائج مشابهة لـ
Transform
، مما يظهر كيف أن هذه العمليات موجودة بالفعل في اللغة.
مثال على استخدام LINQ
باستخدام LINQ، يمكن تنفيذ عمليات التجميع والتطبيقات كما يلي:
listInstance.Aggregate(startingValue, (x, y) => /* تجميع قيمتين متتاليتين */);
listInstance.ForEach(x => /* قم بشيء مع x */);
الخاتمة
يتيح لك إنشاء دوال Map
و Reduce
كطرق توسيع في C# الاقتراب من معالجة البيانات بأسلوب أكثر وظيفية. ومع ذلك، من الضروري التعرف على قوة LINQ، الذي يتضمن بالفعل وظائف قوية لعمليات مماثلة. من خلال فهم كلا النهجين، يمكنك اختيار الأداة الأفضل لتلبية احتياجاتك البرمجية.
باتباع هذا الدليل، ستتمكن من كتابة كود أنظف وقابل للصيانة عند التعامل مع القوائم في C#. برمجة سعيدة!