هل هناك أي دروس IEnumerable غير قابلة للتكرار؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

هل هناك أي دروس IEnumerable غير قابلة للتكرار؟

وبواسطة غير تكرار أعني حيث لا يمكن الاتصال بأمان GetEnumerator عدة مرات أو حيث تدعو GetEnumerator له آثار جانبية واضحة.

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

المحلول

وFile.ReadLines() لا إرجاع IEnumerable<T> أن يعمل مرة واحدة فقط.

نصائح أخرى

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

إذا كان لي druthers بلدي، لكان قد تم تقسيم IEnumerable في عائلة من الواجهات. أن العداد وIEnumerable الأساسي لتفقد طريقة إعادة تعيين، وسوف ينقل أي وعد معين من التكرار. ومن شأن IMultiEnumerable جديدة بإرجاع العداد مع طريقة إعادة تعيين ووضمان أن يمر متعددة من شأنه أن يعود البيانات متطابقة. العداد قد يدعم أيضا منهجه GetEnumerator الخاصة (أعتقد أنه يجب أن يكون عمليا في أي نوع التي يمكن أن تدعم متعددة تمر التعداد، فإن التكلفة الوحيدة أن تكون 'بداية' مؤشر حتى العداد متداخلة سيتم إعادة تعيين إلى الموقع الأصلي لها الخلق).

لا، أي فئة يتصرف جيدا أن تنفذ IEnumerable سيسمح التعدادات المتكررة.

لتعداد المجموعات التي لا يمكن تكرارها، لم يكن لديك فئة التي تطبق IEnumerable. بدلا من ذلك لديك أسلوب يقوم بإرجاع العداد. بهذه الطريقة العداد بدلا من فئة يحمل مجموعة، لذلك فمن غير الممكن استدعاء GetEnumerator مرتين لنفس المجموعة. لتكرار العداد لديك لاستدعاء الأسلوب لإنشاء مجموعة جديدة.

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

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