هل هناك فرق بين أساليب مكرر العودة IEnumerable وIEnumerator ؟

StackOverflow https://stackoverflow.com/questions/416651

  •  03-07-2019
  •  | 
  •  

سؤال

والنظر في طريقتين مكرر بنفس الهيئات:

public static IEnumerable<int> It1() { 
    ...
}

public static IEnumerator<int> It2() { 
    ...
}

هل هناك أي ظرف من الظروف حيث تدعو It2 يختلف عن الدعوة It1.GetEnumerator()؟

هل هناك أي وقت مضى سبب وجيه لتعريف مكرر كما IEnumerator<T> على IEnumerable<T>؟ الوحيد الذي يمكنني أن أفكر هو عند تنفيذ IEnumerable<T>.GetEnumerator().

وتحرير:. بواسطة طرق مكرر أعني طرق استخدام yield return وyield break يبني

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

المحلول

ويمكنك أن تفعل ذلك إذا كنت تريد أن تأخذ المسؤول عن كتابة الطبقة IEnumerable<T> المجمع.

ودعونا نقول أن لديك فئة التي تريد القيام به تعداد على، بلا حدود:

public class EveryDateInTheFuture : IEnumerable<DateTime>
{
    public EveryDateInTheFuture() { this.StartDate = DateTime.Today; }

    public DateTime StartDate { get; set; }

    public IEnumerator<DateTime> GetEnumerator()
    {
         while (true)
         {
             yield return date;
             date = date.AddDays(1);
         }
    }
}

نصائح أخرى

وكما ذكر، لا يمكنك foreach أكثر من IEnumerator<T>. وبسبب ذلك، فإنه يجعل من الصعب على الاندماج في أماكن في التعليمات البرمجية حيث تريد تكرار على ما كنت ستعود.

وأيضا، imp أو ance هنا هو أن IEnumerable<T> ومن المفترض ان يكون المصنع، بحيث يمكن أن تنتج تطبيقات IEnumerator<T> التي لا ترتبط مباشرة إلى تنفيذ مجموعة من T.

والأهم الآن هو حقيقة أن جميع طرق الإرشاد لLINQ تعمل خارج IEnumerable<T>، لذلك سوف تريد أن تجعل التعدادات الخاصة بك سهلة للعمل مع ممكن من خلال إعادة ذلك.

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