ما هو الجزء الثابت والأنيق والقابل لإعادة الاستخدام من التعليمات البرمجية لتحديد ما إذا كان IEnumerable فارغًا في .NET؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

على الرغم من أنني قمت بتطوير إجابة لـ .NET 3.5 والتي عملت بشكل جيد بالنسبة لي حتى الآن، فإن فكرتي الحالية هي أنه لا توجد إجابة مثالية، نظرًا لأن IEnumerable يمكنه تقنيًا تغليف مجموعة (أو قائمة انتظار من التكرارات) التي تعدل النتائج الأساسية كـ فإنه يتكرر، الأمر الذي من شأنه أن يسبب مشاكل.ومع ذلك، قد يكون هذا أيضًا عائقًا أمام تنفيذ IEnumerable.Count()، وهذا لم يمنع MS من توفيره.

لذلك اعتقدت أنني سأضعه على SO لمعرفة ما إذا كان لدى شخص ما خيار أفضل، وفي حالة ما إذا وجده شخص آخر مفيدًا.

يحرر: واو، لا أستطيع أن أصدق أنني لم أكن أعرف عن IEnumerable.Any.كنت أعرف أنه موجود، ولكن لم أكلف نفسي عناء التحقق مما حدث.اجعل هذا درسا لك.اقرأ الوثائق.فقط لأن اسم الطريقة لا يعني أنها تفعل ما تريد، لا يعني أنها لا تفعل ما تريد.

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

المحلول

!enumerable.Any()

سيحاول الاستيلاء على العنصر الأول فقط.

للتوسع في كيفية/لماذا يعمل هذا، يحدد أي ما إذا كان أي من مكونات ملف IEnumerable تطابق دالة معينة، إذا لم يتم تقديم أي منها، فسينجح أي مكون، مما يعني أن الوظيفة ستعود صحيحة إذا كان العنصر موجودًا في القابل للإحصاء.

نصائح أخرى

بالنسبة لـ.net 1/2:

IEnumerator e;
try
{
   e = enumerable.GetEnumerator();
   return e.MoveNext();
}
finally
{ 
    if (e is IDisposable)
        e.Dispose();
}

أو مع الأدوية العامة:

using (IEnumerator<T> e = enumerable.GetEnumerator())
{
    return e.MoveNext();
}

أنت على حق أنه لا توجد إجابة مثالية.IEnumerable يدعم التكرار فقط ولا يضمن أن التعداد قابل للتكرار.لا يمكنك معرفة ما إذا كان التعداد يحتوي على عناصر دون استدعاء MoveNext مرة واحدة على الأقل، وبمجرد الانتهاء من ذلك، لا يمكنك ضمان القدرة على إعادة استخدام التعداد:من المسموح لـ IEnumerable.Reset طرح NotSupportedException.من http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.reset.aspx:

"يتم توفير أسلوب إعادة التعيين لإمكانية التشغيل التفاعلي لـ COM.ليس بالضرورة أن يتم تنفيذه؛بدلاً من ذلك، يمكن للمنفذ ببساطة طرح NotSupportedException."

تحتاج أساليب الامتداد مثل IEnumerable<T>.Count وIEnumerable<T>.Any إلى الاتصال بـ MoveNext تحت الأغطية.أغلفة مفيدة، ولكن لا تتجنب حقيقة أنه في الحالات (النادرة) التي لا يدعم فيها التعداد إعادة التعيين، قد تواجه مشكلة.

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

في هذه الحالات، ليس لديك حقًا تكلفة في foreach حلقة، طالما أنك تأخذ في الاعتبار حقيقة أنها قد لا تتكرر مرة واحدة.

الطريقة الأولى لها تطبيق بسيط لطريقة التمديد الفارغة:http://signum.codeplex.com/SourceControl/changeset/view/25903#510468

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