استبدال تكرار المصفوفات for... if في C#

إذا كنت مطورًا قد عملت مع المصفوفات والحلقات في C#، فقد تواجه موقفًا تحتاج فيه إلى تكرار مصفوفة وتطبيق بعض التحولات بناءً على شرط معين. بينما قد تبدو التكرارات البسيطة باستخدام foreach بديهية، فإنها غالبًا ما تؤدي إلى حلول أقل أناقة. في هذا المنشور، سنستكشف العوائق الشائعة لاستخدام foreach مع الشروط ونقدم بدائل قوية يمكن أن تبسط شيفرتك، تمامًا كما تفعل قائمة الشمول في بايثون.

المشكلة مع foreach

فكر في الحلقة foreach التالية، التي تقوم بزيادة القيم في مصفوفة بناءً على شرط:

foreach (int x in intArray)
  if (x > 3) // شرط عام على x
    x++; 
    // قم بعمليات معالجة أخرى

تسليط الضوء على المشكلة

  • حدود التعديل: المشكلة الرئيسية هنا هي أن عملية الزيادة على x لا تعدل محتويات المصفوفة الأصلية. ونتيجة لذلك، لا تحقق هذه الطريقة التأثير المطلوب لتحديث القيم في intArray كما تتوقع.

استخدام حلقة for التقليدية

لتعديل محتويات المصفوفة بشكل فعال، يجب عليك استخدام حلقة for التقليدية. إليك كيفية تنفيذها:

for(int i = 0; i < intArray.Length; ++i)
{
    if(intArray[i] > 3) 
        ++intArray[i];
}

مزايا حلقة for

  • تعديل مباشر: تتيح لك هذه الطريقة تعديل عناصر المصفوفة مباشرة، مما يضمن أن أي تغييرات تظهر فوريًا داخل المصفوفة نفسها.
  • مرونة: يمكنك بسهولة التلاعب بالفهارس وتنفيذ منطق أكثر تعقيدًا حسب الحاجة.

الاستفادة من LINQ للتحويل

يمكن أن توفر LINQ (استعلام متكامل مع اللغة) أيضًا حلولًا لتكرار المصفوفات، على الرغم من أنها موجهة أكثر نحو إنشاء تسلسلات جديدة بناءً على الموجودة، بدلاً من تعديلها في مكانها. إليك couple من الأمثلة:

استخدام LINQ لتحويل البيانات

لإنشاء مصفوفة جديدة مُحوَّلة، يمكنك تطبيق LINQ على النحو التالي:

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

مثال باستخدام جملة where

إذا كنت تريد تصفية العناصر التي تقل عن عتبة معينة وإنشاء مصفوفة جديدة، يمكنك فعل ذلك:

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

تذكر

  • إنشاء تسلسلات جديدة: تذكر أن LINQ ليست موجهة لاستخدامها في تعديل المجمعات الموجودة، بل لإنشاء تسلسلات جديدة بناءً على التحولات أو الفلاتر.

استخدام أسلوب ForEach

بالنسبة للمصفوفات، يقدم C# أيضًا أسلوب ForEach الذي يتيح لك استخدام دالة لامدا لإجراءات أبسط:

intArray.ForEach(i => DoSomething(i));

اعتبارات

  • متى تستخدم ForEach: تعمل هذه الطريقة بشكل جيد لتنفيذ كتلة من الشفرة لكل عنصر، لكن قد لا تكون مرنة مثل حلقة foreach أو for للعمليات الأكثر تعقيدًا.

الخاتمة

باختصار، بينما قد تبدو حلقة foreach جذابة لتكرار المصفوفات في C#، فإن استخدام حلقة for التقليدية هو أكثر عملية عندما تحتاج إلى تعديل العناصر مباشرة. استكشف LINQ لإنشاء تسلسلات جديدة بناءً على الشروط، واعتبر استخدام أسلوب ForEach لعمليات مبسطة على المجمعات. ستساعدك هذه البدائل على كتابة شيفرة C# أنظف وأكثر قابلية للقراءة وفعالية.

من خلال فهم قدرات وقيود كل بنية، ستكون أكثر تأهيلاً لاختيار الأداة المناسبة لمهام البرمجة الخاصة بك في المستقبل.