سؤال

أنا اسقاط هذا الخط بعد أن زار مواقع مختلفة في محاولة فهم في الوقت الحقيقي سبيل المثال استخدام مخصص التعداد.لدي أمثلة.لكنها تؤدي بي إلى الارتباك.

على سبيل المثال

تأخذ 1

class NumberArray
{
    public int[] scores;

    public NumberArray()
    {
    }

    public NumberArray(int[] scores)
    {
        this.scores = scores;
    }

    public int[] Scores
    {
        get {return scores;}
    }

}

تأخذ 2

public class Enumerator : IEnumerator
{
    int[] scores;
    int cur;
    public Enumerator(int[] scores)
    {
        this.scores = scores;
        cur = -1;
    }
    public Object Current
    {
        get {
            return scores[cur];
        }
    }

    public void Reset()
    {
        cur = -1;
    }

    public bool MoveNext()
    {
        cur++;
        if (cur < scores.Length)
            return true;
        else return false;
    }
}

public class Enumerable : IEnumerable
{
    int[] numbers;

    public void GetNumbersForEnumeration(int[] values)
    {
        numbers = values;
        for (int i = 0; i < values.Length; i++)
            numbers[i] = values[i];
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(numbers);
    }
}

الرئيسية

static void Main()
{
    int[] arr = new int[] { 1, 2, 3, 4, 5 };
    NumberArray num = new NumberArray(arr);
    foreach(int val in num.Scores)
    {
        Console.WriteLine(val);
    }

    Enumerable en = new Enumerable();
    en.GetNumbersForEnumeration(arr);

    foreach (int i in en)
    {
        Console.WriteLine(i);
    }
    Console.ReadKey(true);
}

في اتخاذ 2 ، تابعت مخصص التكرار تكرار نفس عدد صحيح مجموعة كما فعلت في تأخذ 1.لماذا يجب أن دوخ تكرار عدد صحيح باستخدام مخصص التكرار?

ربما غاب في الوقت الحقيقي مخصص التكرار ضرورة.يمكن لك أن تشرح لي هذه المهمة التي لا أستطيع أن أفعل مع القائمة التكرار المنشأة ؟ (لقد أنهيت دراستي حتى تعطيني مثال بسيط, حتى أستطيع أن أفهم بشكل صحيح).

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

هل كانت مفيدة؟

المحلول

مخصص التكرار هي مفيدة عندما تكون الموارد كنت بالتكرار لا قبل تحميلها في الذاكرة, ولكن بدلا من ذلك الحصول على حسب الحاجة في كل تكرار.على سبيل المثال ، في LINQ to SQL, عندما كنت تفعل شيئا مثل:

foreach(var employee in dataContext.Employees) {
    // Process employee
}

في كل خطوة من foreach حلقة الموظفين الجدول في قاعدة البيانات الاستعلام للحصول على السجل التالي.بهذه الطريقة, إذا كنت الخروج من حلقة في وقت مبكر ، أنك لم تقرأ كامل الجدول ، ولكن فقط السجلات كنت في حاجة.

انظر هنا للحصول على مثال في العالم الحقيقي: تعداد الخطوط في الملف.هنا كل سطر من الملف على كل التكرار من foreach حلقة.(ملاحظة جانبية .NET Framework 4 يقدم نفس وظائف المدمج في).

نصائح أخرى

أن نكون صادقين, أنا لست متأكدا تماما ما تطلبه, ولكن إذا كنت تشعر بالقلق إزاء الفرق بين إرجاع صفيف (كما في اتخاذ 1) والعودة مكرر (خذ 2), هنا هو جوابي.

هناك فرق كبير بين العودة مجموعة والعودة مكرر.إرجاع صفيف يعني العودة الدولة الداخلي (إلا إذا قمت بإجراء نسخة كجزء من العودة ، ولكن هذا هو الثمن).إذا كنت العودة مكرر يمكنك العودة فقط فكرة مجردة ، من شأنها أن تتيح للمتصلين تكرار الدولة.وهذا يعني أيضا أنك يمكن أن تفعل كسول تقييم إذا كنت بحاجة إلى (شيء من الواضح أنك لا تستطيع أن تفعل إذا كنت إرجاع صفيف).

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

مجرد مثال آخر حيث العرف التكرار مفيدا لي في الماضي كان توفير التجريد بشكل متكرر تعداد كافة العقد في بنية شجرة...

foreach (Node n in tree)
  //...do something
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top