عبارة Visual Basic) For Each...Next)

تكرر مجموعة من العبارات لكل عنصر في المجموعة.

For Each element [ As datatype ] In group
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ element ]

الأجزاء

  • element
    مطلوبة في العبارة For Each. اختيارية في العبارة Next. متغير يستخدم ليكرر خلال عناصر المجموعة.

  • datatype
    مطلوبة إذا لم تكن element معرفة بالفعل. نوع بيانات element.

  • group
    مطلوبة. متغير كائن. يشير إلى مجموعة statements سيتم تكرارها.

  • statements
    اختياري. عبارة أو أكثر بين For Each و Next تعمل على كل عنصر في group.

  • Continue For
    اختياري. تنقل التحكم لبداية التكرار الحلقي For Each.

  • Exit For
    اختياري. تنقل التحكم خارج التكرار الحلقي For Each.

  • Next
    مطلوبة. تنهي تعريف التكرار الحلقي For Each.

ملاحظات

استخدم التكرار الحلقي For Each... Next عندما تريد تكرار مجموعة من العبارات لكل عنصر من مجموعة أو صفيف.

يعمل عبارة Visual Basic) For...Next) بشكل جيد عندما تستطيع إقران كل تكرار في التكرار الحلقي مع متغير عنصر التحكم وتحديد قيم ذلك المتغير الأولية و النهائية. ومع ذلك، عند التعامل مع مجموعة، مفهوم القيم الأولية والنهائية ليس ذا معنى، وأنت لا تعرف بالضرورة عدد عناصر المجموعة. في هذه الحالة، يكون التكرار الحلقي For Each... Next خيار أفضل.

القواعد

  • أنواع البيانات. نوع بيانات element يجب أن يكون من نوع بيانات يستطيع نوع بيانات عناصر group التحول إليه.

    نوع بيانات group يجب أن يكون نوع المرجع الذي يشير إلى مجموعة أو صفيف قابلة للإحصاء. عادة يعني هذا أن group يشير إلى كائن ما يطبّق واجهة IEnumerable لمساحة الاسم System.Collections أو واجهة IEnumerable<T> لمساحة الاسم System.Collections.Generic . IEnumerable تعرّف الأسلوب GetEnumerator، الذي يرجع كائن عداد للمجموعة. يطبّق كائن العداد واجهة IEnumerator لمساحة الاسم System.Collections و الكشف عن خاصية Current و الأساليب Reset و MoveNext . يستخدم Visual Basic هذه لاجتياز المجموعة.

    عناصر group وتكون عادةً من النوع Object ولكن يمكن أن تكون من أي نوع بيانات وقت التشغيل .

  • التحويلات التضييقية عند تعيين Option Strict إلى On، التحويل التضييقي عادةً يسبب أخطاء في برنامج التحويل البرمجي. في المثال التالي تعيين m كقيمة أولية لـ n لا يحول برمجياً إذا كان Option Strict في حالة تشغيل لأن تحويل Long إلى Integer هو تحويل تضييقي.

    Dim m As Long = 987
    ' Does not compile.
    'Dim n As Integer = m
    

    ومع ذلك، التحويلات من العناصر في group إلى element يتم تقييمها وتنفيذها في وقت التشغيل و خطأ التحويل التضييقي يمنع. في المثال التالي، لا يتم الإعلان عن أي خطأ في برنامج التحويل البرمجي في التكرار الحلقي For Each، على الرغم من أنه يتطلب نفس التحويل من Long إلى Integer الذي تسبب بخطأ في المثال السابق.

    Option Strict On
    Module Module1
        Sub Main()
    
            ' The assignment of m to n causes a compiler error when 
            ' Option Strict is on.
            Dim m As Long = 987
            'Dim n As Integer = m
    
            ' The For Each loop requires the same conversion, but
            ' causes no errors. The output is 45 3 987.
            For Each p As Integer In New Long() {45, 3, 987}
                Console.Write(p & " ")
            Next
            Console.WriteLine()
        End Sub
    End Module
    
    

    عدم وجود خطأ في برنامج التحويل البرمجي لا يمنع خطر الخطأ في وقت التشغيل. في المثال التالي، لم يتم الإعلان عن خطأ في برنامج التحويل البرمجي، ولكن يحدث خطأ في وقت التشغيل عند تطبيق ToInteger إلى 9876543210. يحدث خطأ وقت التشغيل سواء كان Option Strict في حالة تشغيل أو إيقاف.

    Option Strict On
    
    Module Module1
        Sub Main()
    
            ' The assignment of m to n causes a compiler error when 
            ' Option Strict is on.
            Dim m As Long = 9876543210
            'Dim n As Integer = m
    
            Try
                ' The For Each loop requires the same conversion, but
                ' is not flagged by the compiler. A run-time error is 
                ' raised because 9876543210 is too large for type Integer.
                For Each p As Integer In New Long() {45, 3, 9876543210}
                    Console.Write(p & " ")
                Next
                Console.WriteLine()
            Catch e As System.OverflowException
                Console.WriteLine()
                Console.WriteLine(e.Message)
            End Try
        End Sub
    End Module
    
    
  • التعريف إذا لم يتم تعريف element خارج هذا التكرار الحلقي، يجب تعريفه داخل العبارة For Each. يمكنك تعريف النوع element بشكل صريح باستخدام العبارة As، أو يمكنك الاعتماد على استنتاج النوع لتعيين النوع. في كلتا الحالتين، نطاق element هو النص الأساسي للتكرار الحلقي. ومع ذلك، يتعذر تعريف element خارج و داخل التكرار الحلقي بنفس الوقت.

  • عدد التكرارات. يقيم Visual Basic المجموعة لمرة واحدة فقط، قبل بدء التكرار الحلقي. إذا تم تغيير مقطع العبارة element أو group، لا تؤثر هذه التغييرات على التكرار من التكرار الحلقي.

  • التكرارات الحلقية المتداخلة. يمكنك إنشاء تكرارات حلقية For Each متداخلة بوضع تكرار حلقي داخل تكرار حلقي أخر. مع ذلك، يجب أن يكون لدى كل تكرار حلقي متغير element فريد.

    يمكنك أيضا مداخلة أنواع مختلفة من بنيات التحكم داخل بعضها البعض. لمزيد من المعلومات، راجع بنيات التحكم المتداخلة.

    ملاحظة

    إذا تمت مواجهة عبارة Next لمستوى تداخل خارجي قبل Next لمستوى داخلي، يشير المحول البرمجي لخطأ. ومع ذلك، برنامج التحويل البرمجي يمكنه اكتشاف خطأ التداخل هذا فقط إذا حددت element في كل عبارة Next.

  • تعريف متغير التحكم. يمكنك بشكل اختياري تحديد element في العبارة Next. يؤدي ذلك إلى تحسين القدرة على قراءة البرنامج الخاص بك، خاصةً إذا تم عمل تكرارات حلقية For Each متداخلة. يجب تحديد المتغير نفسه كالذي يظهر في العبارة For Each المتناظرة.

  • نقل التحكم لبداية التكرار الحلقي. يقوم متابعة الكشف (Visual Basic) بنقل التحكم مباشرةً إلى العبارة For لشرط اختبار التكرار الحلقي التالي. قد تحتاج إلى متابعة تكرار حلقي إذا اكتشفت شرط يجعل من غير الضروري تنفيذ التعليمات البرمجية المتبقية في التكرار الحلقي.

    يمكنك وضع أي عدد من عبارات Continue For في أي مكان في التكرار الحلقي For Each. تستخدم غالباً Continue For بعد تقييم شرط ما على سبيل المثال في بنية If... Then... Else.

  • النقل خارج التكرار الحلقي. ينقل عبارة الخروج Vsual Basic) ) التحكم مباشرةً إلى العبارة التي تلي العبارة Next. قد تحتاج إلى إنهاء تكرار حلقي إذا اكتشفت شرط يجعل من غير الضروري أو من المستحيل متابعة التكرار، مثل قيمة خاطئة أو طلب إنهاء. أيضاً، إذا اكتشف استثناء في العبارة Try... Catch... Finally، يمكنك استخدام Exit For في النهاية المقطع Finally.

    يمكنك وضع أي عدد من عبارات Exit For في أي مكان في التكرار الحلقي For Each. تستخدم غالباً Exit For بعد تقييم شرط ما على سبيل المثال في بنية If... Then... Else.

  • **التكرارات الحلقية اللامنتهية.**استخدام واحد لـExit For يقوم على اختبار شرط قد يتسبب بتكرار حلقي لا منتهي ، وهو عبارة عن تكرار حلقي يعمل لعدد كبير جداً أو حتى لعدد لا نهائي من المرات. إذا اكتشفت شرط كهذا، يمكنك استخدام Exit For للهروب من التكرار الحلقي. لمزيد من المعلومات، راجع كشف Do...التكرار الحلقي (Visual Basic).

السلوك

  • إدخال في التكرار الحلقي. عند بدأ تنفيذ التكرار الحلقي For Each... Next، يتحقق Visual Basic من أن group يشير إلى كائن مجموعة صحيح. إذا لم يكن كذلك، يطرح استثناء. وإلا، يستدعي الأسلوب MoveNext و خاصية كائن العداد Current لإرجاع أول عنصر. إذا كان MoveNext يشير أنه ليس هناك أي عنصر أخر، هذا يعني، إذا كانت المجموعة فارغة، فإن التكرار الحلقي For Each انتهى ويتم تمرير التحكم إلى العبارة التي تلي العبارة Next. وبخلاف ذلك، يقوم Visual Basic بتعيين element إلى أول عنصر و ينفذ مقطع العبارة.

  • تكرارات من التكرار الحلقي. كلما واجه Visual Basic العبارة Next فإنه يرجع إلى العبارة For Each. مرة أخرى يستدعي MoveNext و Current لإرجاع العنصر التالي، و مرة أخرى إما ينفذ المقطع أو ينهي التكرار الحلقي استناداً إلى النتيجة. و تستمر هذه العملية حتى يشير MoveNext إلى أنه ليس هناك أي عنصر أخر أو يواجه العبارة Exit For.

  • إنهاء التكرار الحلقي. عندما يتم تعيين كل العناصر في المجموعة بنجاح إلى element، يتم انهاء التكرار الحلقي For Each ويتم تمرير التحكم إلى العبارة التي تلي العبارة Next.

  • تغيير قيم التكرار. تغيير قيمة element وهي لاتزال داخل التكرار الحلقي يمكن أن يجعل قراءة وتصحيح التعليمات البرمجية الخاصة بك أكثر صعوبة. تغيير قيمة group لا يؤثر على المجموعة أو عناصرها ، والتي تم تحديدها عندما تم الدخول في التكرار الحلقي للمرة الأولى.

  • ترتيب الاجتياز. عند تنفيذ التكرار الحلقي For Each... Next ، اجتياز المجموعة يكون تحت تحكم كائن العداد الذي تم إرجاعه بواسطة الأسلوب GetEnumerator. لا يتم تحديد ترتيب الاجتياز بواسطة Visual Basic ولكن بواسطة أسلوب كائن العداد MoveNext. وهذا يعني أنه قد لا تتمكن من توقع أي عنصر من المجموعة سيكون أول عنصر يتم إرجاعه في element، أو أي عنصر من المجموعة سيكون أول عنصر يتم إرجاعه بعد عنصر محدد.

    إذا كانت التعليمات البرمجية الخاصة بك تعتمد على اجتياز مجموعة وفق ترتيب معيّن، التكرار الحلقي For Each... Next ليس أفضل خيار إلا إذا كنت تعرف صفات كائن العداد التي تكشفها المجموعة. قد تحصل على نتائج أكثر كفاءة باستخدام بنية تكرار حلقي مختلفة، مثل For... Next أو Do... Loop.

  • تعديل المجموعة. كائن العداد الذي تم إرجاعه من قبل GetEnumerator عادةً لا يسمح لك بتبديل المجموعة بإضافة، حذف، استبدال أو إعادة ترتيب أية عناصر. في حالة تعديل المجموعة بعد تهيئة التكرار الحلقي For Each... Next، الكائن العداد يصبح غير صالح، و أي محاولة للوصول إلى عنصر ينتج عنها استثناء InvalidOperationException.

    ومع ذلك، حظر هذا التعديل لا يتم تحديده بواسطة Visual Basic، ولكن بدلاً من ذلك بواسطة تطبيق واجهة IEnumerable. من الممكن تنفيذ IEnumerable بهذه الطريقة للسماح بالتعديل أثناء التكرار. إذا أردت إجراء مثل هذا التعديل الحيوي، تأكد من فهم صفات التطبيق IEnumerable على المجموعة التي تستخدمها.

  • تعديل عناصر مجموعة. خاصية الكائن العداد Current تعتبر للقراءة فقط (Visual Basic)، و تقوم بإرجاع نسخة محلية عن كل عنصر مجموعة. وهذا يعني أنه لا يمكنك تعديل العناصر نفسها في التكرار الحلقي For Each... Next . يؤثر أي تعديل تقوم به على النسخ المحلية فقط من Current و لا ينعكس مرة أخرى في المجموعة الأساسية. ومع ذلك، إذا كان العنصر من نوع مرجع، يمكنك تعديل أعضاء المثيل الذي يشير إليه. فيما يلي مثال يوضّح ذلك.

    Sub lightBlueBackground(ByVal thisForm As System.Windows.Forms.Form)
        For Each thisControl As System.Windows.Forms.Control In thisForm.Controls
            thisControl.BackColor = System.Drawing.Color.LightBlue
        Next thisControl
    End Sub
    

    المثال السابق يمكنه تعديل العضو BackColor في كل عنصر thisControl، على الرغم من أنه لا يمكنه تعديل thisControl نفسه.

  • عبور الصفائف. لأن الفئة Array تطبّق الواجهة IEnumerable، كل الصفائف تكشف الأسلوب GetEnumerator. وهذا يعني أنه يمكنك التكرار خلال صفيف بالتكرار الحلقي For Each... Next. ومع ذلك، يمكنك فقط قراءة عناصر الصفيف، وليس تغييرها. للحصول توضيح، راجع كيفية القيام بما يلي: تشغيل عدة كشوف لكل عنصر في مجموعة أو صفيف.

مثال

يستخدم المثال التالي العبارة For Each... Next للبحث في كل العناصر في المجموعة عن السلسلة "Hello". المثال يفترض أن المجموعة thisCollection تم بالفعل إنشائها و أن عناصرها من نوع String.

Dim found As Boolean = False
Dim thisCollection As New Collection
For Each thisObject As String In thisCollection
    If thisObject = "Hello" Then
        found = True
        Exit For
    End If
Next thisObject

راجع أيضًا:

المهام

كيفية القيام بما يلي: تشغيل عدة كشوف لكل عنصر في مجموعة أو صفيف

كيفية القيام بما يلي: تحسين أداء التكرار الحلقي

المرجع

كشف While...End While (Visual Basic)

كشف Do...التكرار الحلقي (Visual Basic)

المبادئ

بنيات التكرار الحلقي

الـمجموعات في Visual Basic

توسيع و تضييق التحويلات