كيفية القيام بما يلي: الوصول إلى فئة المجموعة مع foreach (دليل البرمجة لـ #C)

يبين نموذج التعليمات البرمجية التالية كيفية كتابة فئة مجموعة غير عامة يمكن استخدامها مع foreach. الفئة تعمل كمجزّئة لسلسلة حرفية تشبه دالة وقت التشغيل C strtok_s.

ملاحظة

يمثل هذا المثال طريقة نوصي بها فقط عندما لا يمكنك استخدام فئة المجموعة العامة. الأشياء العامة مدعومة في الإصدار 2.0 والإصدارات اللاحقة من لغة #C و .NET Framework. للحصول على مثال عن كيفية إلى تطبيق فئة ألوان نوع مجموعة عامة التي تدعم IEnumerable<T> ووبالتالي تجنب المشكلات التي تمت مناقشتها لاحقاً في هذا إلى صورة، راجع كيفية القيام بما يلي: إنشاء كتلة مكرر للقائمة العامة (دليل البرمجة لـ #C).

في المثال التالي Tokens تفصل الجملة "This is a sample sentence." إلى رموز مميزة باستخدام ' ' و '-' كفواصل, وتعداد تلك الرموز المميزة مع عبارة foreach:

Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

foreach (string item in f)
{
    System.Console.WriteLine(item);
}

داخلياً تستخدم Tokens صفيف يطبق IEnumerator و IEnumerable. من الممكن لمثال التعليمات البرمجية استخدام أساليب قائمة التعداد للصفيف الخاص به ولكن قد يقوم ذلك بتخريب الغرض من هذا المثال.

في #C، ليس ضرورياً لفئة المجموعة أن ترث من IEnumerable و IEnumerator لكي تصبح متوافقة مع foreach. طالما طلبت الفئة الأعضاء GetEnumeratorو MoveNext و Reset و Current فإنها تعمل مع foreach. أحد فوائد إهمال الواجهات هو تمكينك من تعريف نوع الإرجاع لـ Current ليكون محدداً أكثر من Object وذلك يوفر أمان النوع.

على سبيل المثال, بدءاً من نموذج التعليمات البرمجية في هذا الموضوع قم بتغيير الأسطر التالية:

// No longer inherits from IEnumerable:
public class Tokens  
// Doesn't return an IEnumerator:
public TokenEnumerator GetEnumerator()  
// No longer inherits from IEnumerator:
public class TokenEnumerator  
// Type-safe: returns string, not object:
public string Current  

الآن، لأن Current تقوم بإرجاع سلسلة حرفية يمكن للمحول البرمجي اكتشاف ما إذا تم استخدام نوع غير متوافق في عبارة foreach:

// Error: cannot convert string to int:
foreach (int item in f)  

أما سيئات إهمال IEnumerable و IEnumerator هو أن فئة المجموعة لم تعد قابلة للتشغيل المتداخل مع عبارات foreach أو معادلاتها في لغات وقت التشغيل المتوافق مع اللغات العامة الأخرى.

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

مثال

using System.Collections;

// Declare the Tokens class:
public class Tokens : IEnumerable
{
    private string[] elements;

    Tokens(string source, char[] delimiters)
    {
        // Parse the string into tokens:
        elements = source.Split(delimiters);
    }

    // IEnumerable Interface Implementation:
    //   Declaration of the GetEnumerator() method 
    //   required by IEnumerable
    public IEnumerator GetEnumerator()
    {
        return new TokenEnumerator(this);
    }


    // Inner class implements IEnumerator interface:
    private class TokenEnumerator : IEnumerator
    {
        private int position = -1;
        private Tokens t;

        public TokenEnumerator(Tokens t)
        {
            this.t = t;
        }

        // Declare the MoveNext method required by IEnumerator:
        public bool MoveNext()
        {
            if (position < t.elements.Length - 1)
            {
                position++;
                return true;
            }
            else
            {
                return false;
            }
        }

        // Declare the Reset method required by IEnumerator:
        public void Reset()
        {
            position = -1;
        }

        // Declare the Current property required by IEnumerator:
        public object Current
        {
            get
            {
                return t.elements[position];
            }
        }
    }


    // Test Tokens, TokenEnumerator
    static void Main()
    {
        // Testing Tokens by breaking the string into tokens:
        Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

        foreach (string item in f)
        {
            System.Console.WriteLine(item);
        }
    }
}
/* Output:
    This
    is
    a
    sample
    sentence.  
*/

راجع أيضًا:

المرجع

الصفائف (دليل البرمجة لـ #C)

فئات المجموعات (دليل البرمجة لـ #C)

System.Collections.Generic

المبادئ

دليل البرمجة لـ #C

موارد أخرى

مرجع C#‎