سؤال

لدي هذا الرمز

public class SomeClass<T>: IEnumerable<T>
{
    public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

    public IEnumerator<T> GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

كيف يمكنني استخراج IEnumerator من MyList؟

شكرا StackoverFlower....

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

المحلول

وهذا ما يلي:

public List<SomeClass<T>> MyList = new List<SomeClass<T>>();

ويحتاج إلى أن يكون هذا:

public List<T> MyList = new List<T>();

وبعد ذلك، وهذا ينبغي العمل:

public IEnumerator<T> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

وأنت لا يمكن أن يكون

List<SomeClass<T>>

والتي تقوم بسحب العداد ل، لأنك قد حددت في الواجهة التي العداد سيعود عنصر enumerable ل <T>. يمكنك أيضا تغيير IEnumerable<T> أن يكون

IEnumerable<SomeClass<T>>

ووتغيير العداد ليكون

public IEnumerator<SomeClass<T>> Getenumerator ()
{
  foreach (var item in MyList){
     yield return item;}
}

نصائح أخرى

وسيتم return MyList.GetEnumerator() الخيار تافهة.

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

Cannot implicitly convert type `System.Collections.Generic.List<SomeClass<T>>.Enumerator' to `System.Collections.Generic.IEnumerator<T>'(CS0029)

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

حسنا، تلك هي سنتي!

وإذا افترضنا أن هناك طريقة للحصول على T كائن من أصل SomeClass الكائن،

public IEnumerator<T> GetEnumerator()
{
    return MyList.Select(ml => ml.GetT() /* operation to get T */).GetEnumerator();
}

وباعتبارها إضافة إلى إجابة مقبولة، إذا كنت قد تلقيت رسالة

MyNamespace.MyClass<T>' does not implement interface
  member 'System.Collections.IEnumerable.GetEnumerator()'.
  'WindowsFormsApplication1.SomeClass<T>.GetEnumerator()' cannot implement
  'System.Collections.IEnumerable.GetEnumerator()' because it does not have
  the matching return type of 'System.Collections.IEnumerator'.

وتحتاج إلى تنفيذ أسلوب GetEnumerator() إضافية:

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

وIEnumerable<T> تنفذ IEnumerable ذلك كل أشكال GetEnumerator() يجب أن تنفذ.

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