c# - على - التمييز بين المكره وعداد




هل السجن اكراه (6)

"المتكررات هي ميزة جديدة في C # 2.0. مكرر هو طريقة ، الحصول على ملحق أو عامل يتيح لك دعم التكرار في الصف أو البنية دون الحاجة إلى تنفيذ واجهة IEnumerable بأكملها. بدلا من ذلك ، يمكنك توفير مجرد مكرر ، والذي ببساطة اجتياز بنيات البيانات في صفك.عندما يكتشف المحول البرمجي جهاز التكرار الخاص بك ، سيقوم تلقائيًا بإنشاء أساليب Current و MoveNext و Dispose لواجهة IEnumerable أو IEnumerable. " - ام msdn

سؤال مقابلة لمهمة .NET 3.5 هو "ما هو الفرق بين المكرر وعداد"؟

هذا هو التمييز الأساسي الذي يجب القيام به ، وماذا مع LINQ ، إلخ.

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

IMO مكرر "iterates" عبر مجموعة و يوفر العداد وظيفة تكرار ولكن يجب استدعاء هذا.

أيضا ، ويقال باستخدام الكلمات الرئيسية العائد لحفظ الدولة. ما هي بالضبط هذه الحالة؟ هل هناك مثال على هذه الفائدة التي تحدث؟


"في حين أن بيان foreach هو المستهلك من العداد ، مكرر هو منتج من العداد".

ما ورد أعلاه هو كيف "C # 5.0 في A NutShell" يفسر ذلك ، وكان مفيدا بالنسبة لي.

بمعنى آخر ، تستخدم العبارة foreach MoveNext () ، والخاصية الحالية لـ IEnumerator لتكرارها من خلال تسلسل ، بينما يتم استخدام المكرر لإنتاج تنفيذ IEnumerator الذي سيتم استخدامه بواسطة العبارة foreach. في C # ، عندما تكتب طريقة iterator تحتوي على بيان العائد ، سيقوم المترجم بإنشاء حساب خاص لك. وعندما تقوم بالتكرار خلال العناصر الموجودة في التسلسل ، ستقوم باستدعاء MoveNext () والخاصية الحالية للعداد الخاص. يتم تنفيذ هذه الطرق / الخصائص بواسطة التعليمة البرمجية الخاصة بك في طريقة الكادر الذي سيُطلق عليه بشكل متكرر لإعطاء قيم حتى لا تكون هناك قيم متبقية للإنتاج.

هذا هو فهمي لكيفية تعريف C # العدادين ، والمكررات.


تعني كلمة "تكرار" تكرار بعض الخطوات ، بينما تعد تعدادًا لكل القيم في مجموعة من القيم. لذا فإن التعداد يتطلب عادةً نوعًا من التكرار.

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

لاحظ "عادة" - يمكن أيضا أن يتم تنفيذ تعداد بشكل متكرر ، ولكن ترتبط ارتباطا وثيقا بالتكرار والتكرار بحيث لا يهمني هذا الاختلاف الطفيف.

يمكنك أيضًا تعداد قيم لا تخزنها بشكل صريح في مجموعة. على سبيل المثال ، يمكنك تعداد العدد الطبيعي ، أو الأعداد الأولية ، أو أيًا كان ، لكنك ستحسب هذه القيم أثناء التعداد ولا تسترجعها من مجموعة مادية. أنت تفهم هذه الحالة كتعداد مجموعة ظاهرية بقيمها المحددة بواسطة بعض المنطق.

أفترض أن ريد كوبسي حصل على هذه النقطة. في C # هناك طريقتان رئيسيتان لتعداد شيء ما.

  1. تنفيذ Enumerable وفئة تنفيذ IEnumerator
  2. تنفيذ مكرر مع بيان yield

الطريقة الأولى هي أصعب لتنفيذ واستخدام الكائنات لتعداد. الطريقة الثانية أسهل في التنفيذ وتستخدم الاستمرارية.


في C # 2+ ، تكون iterators طريقة iterators البرمجي لإنشاء الواجهات IEnumerable و / أو IEnumerable <T> تلقائياً نيابة عنك.

بدون المكرر ، ستحتاج إلى إنشاء فئة تنفيذ IEnumerator ، بما في ذلك Current و MoveNext و Reset. هذا يتطلب قدرا كبيرا من العمل. عادة ، يمكنك إنشاء فئة خاصة تقوم بتطبيق IEnumerator <T> للنوع الخاص بك ، ثم سيقوم class.GetEnumerator () بإنشاء هذه الفئة الخاصة وإعادتها.

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

المتكررون مطورون جدا للمطورين - تتم الأمور بطريقة فعالة جدا ، بجهد أقل بكثير.

عند استخدام foreach ، سيقوم الاثنان بالتصرف بشكل متماثل (بشرط أن تكتب IEnumerator المخصص الخاص بك بشكل صحيح). تجعل المتكررات الحياة أكثر بساطة.


ما يستدعي C # مكررًا أكثر شيوعًا (خارج C # world) يسمى وظيفة generator أو المولد (على سبيل المثال في Python). وظيفة المولد هي حالة متخصصة من coroutine . AC # iterator (generator) هو شكل خاص من العداد (نوع بيانات يقوم بتنفيذ واجهة IEnumerable ).

أنا لا أحب هذا الاستخدام لمصطلح iterator لمولد C # لأنه هو مجرد العداد كما هو مكرر. متأخرة جدا بالنسبة لشركة مايكروسوفت لتغيير رأيها على الرغم من.

على النقيض من ذلك ، اعتبر أنه في C ++ مكرر هي القيمة التي تستخدم في المقام الأول للوصول إلى العناصر المتسلسلة في مجموعة. يمكن أن يكون متقدمًا ، ويتم استدعاؤه لاسترداد قيمة ، واختباره لمعرفة ما إذا كان قد تم الوصول إلى نهاية المجموعة.


يتعامل التعداد مع الكائنات بينما يتعامل التكرار مع القيم فقط. يتم استخدام التعداد عندما نستخدم متجهات hashtable etc بينما يتم استخدام التكرار في حلقة loop إلخ. إنني لم أستخدم أبدًا الكلمة الرئيسية للعرض لذا لم أتمكن من إخبارك.







enumeration