هو ترتيب الكائنات التي تم إرجاعها بواسطة FOREACH مستقرة ؟

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

سؤال

أنه من الأسلم أن نفترض أن اثنين itterations على نفس المجموعة سيعود الكائنات في نفس الأمر ؟ ومن الواضح فمن المفترض أن جمع ولم يتم تغييرها.

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

المحلول

والجواب باختصار - نعم

من الواضح، على الرغم من ترتيب العناصر في مجموعة قد لا تكون تماما كما أدرجت، وهذا يتوقف على نوع من مجموعة (القاموس، على سبيل المثال).

ولكن سوف تحصل على نفس النتائج في كل مرة تقوم تكرار أكثر من واحد، وجمع معدلة باستخدام حلقة foreach.

نصائح أخرى

وهذا يعتمد على نوع المجموعة. بالنسبة لمعظم المجموعات، وكان الجواب "نعم".

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

وأنت لا تستطيع أن تضمن هذا إلا إذا كنت تعرف التنفيذ الفعلي للدرجة التي كنت بالتكرار عبر.

والمجموعات التي لديك أمر عنصر تحديدا (مثل List<T>) سوف تعداد في نظام مستقر.

لمجموعات حيث حالة الكائن لا يغير فمن المحتمل جدا أن العناصر سوف يعود في نفس الترتيب، على سبيل المثال Dictionary<K,V>، على الرغم من أن هذه ليست مضمونة من قبل المواصفات.

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

في حين أن الجواب هو "نعم" على جميع مدمج مجموعات و ربما أي عاقل جمع الصف هناك وثائق لا يملك أي قيود وضعت على IEnumerable.ولذلك لا يقول لنا أن كل التكرار يجب أن تكون مستقرة.

يمكنني أن أتخيل قضية استعمال التالية:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

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

حتى إذا كنت ترغب أيضا في النظر في غريب الشريط الحدودي الحالات يجب أن تكون الإجابة "لا”.

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

وأستطيع أن أرى الحال بالنسبة لفئة مجموعة التي تهدف على وجه التحديد للعودة العناصر في ترتيب عشوائي، على سبيل المثال.

وباختصار، إلا إذا كنت تعرف تنفيذ الداخلي للفئة مجموعة، <م> لا تفترض أي شيء حول هذا الأمر.

وينق يحدد IOrderedEnumerable واجهة لهذا الغرض.

وإعادة "معدلة" (NM الرد في) - نلاحظ أن العديد من حاويات معقدة مثل قاموس لا تضمن للحفاظ على النظام. في بعض الأحيان إضافة عنصر وجعله يبدو الماضي (إعطاء الانطباع بأن يتم حفظ النظام)، وأحيانا فإن ذلك سيكون سببا الدلاء الداخلية إلى إعادة تنظيم، وإعطاء أمر مختلف تماما.

وأشياء مثل SortedList <،> وما إلى ذلك من الواضح القواعد الخاصة بها.

وأود أن أقول إن لجمع معظم فمن الأسلم أن نفترض ذلك. انها ليست وراء العوالم من إمكانية أن مجموعة معينة يمكن أن يكون العداد تنفيذها بطريقة غير القطعية، ولكن هذا ربما لن يحدث ...

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