سؤال

حسنًا، لنبدأ بهذه الطريقة البسيطة جدًا للنقر على الزر

    private void button1_Click(object sender, EventArgs e)
    {
        int counter = 1;
        List<int> items = new int[] { 1, 2, 3 }.ToList();
        List<int>.Enumerator enm = items.GetEnumerator();

        // 1
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        // 2
        if (!enm.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        //3
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        if (enm.MoveNext()) 
            throw new Exception("Unexpected continuation of list");
    }

هذه الطريقة لا تفعل شيئًا لأن كل تأكيد يمر بأمان.الأمور على ما يرام حتى أعتقد أنني يجب أن أقدم طريقة لإزالة التكرار

    static void AssertNext(ref int counter, List<int>.Enumerator e)
    {
        if (!e.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (e.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, e.Current));
        counter++;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var counter = 1;
        var items = new int[] { 1, 2, 3 }.ToList();
        var enm = items.GetEnumerator();
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        if (enm.MoveNext()) throw new Exception("Unexpected continuation of list");
    }

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

لا أستطيع أن أفهم ما يحدث.أشعر حقًا أنني مبتدئ في هذا اللغز.

ما الذي أفتقده هنا؟

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

المحلول

أنا أتخيل أن لديه شيء ما يجب القيام به مع قائمة.يمكنك تمريرها إلى طريقة، معالجتها، ثم العودة.ربما لم يحدث التلاعب على مثيلك الأصلي.

نصائح أخرى

List<T>.Enumerator هو نوع قيمة مما يعني أنه يتم نسخه إلى النطاق المحلي لطريقتك، ويتم تعديله ثم إتلافه عند ترك الطريقة.حاول تمريره حسب المرجع أيضًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top