هل هناك فرق بين أساليب مكرر العودة IEnumerable وIEnumerator ؟
سؤال
والنظر في طريقتين مكرر بنفس الهيئات:
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>
، لذلك سوف تريد أن تجعل التعدادات الخاصة بك سهلة للعمل مع ممكن من خلال إعادة ذلك.