भविष्य में इस पद पर ठोकर खाने वाले थके हुए यात्री की मदद करने के लिए .Count () के नुकसान पर सावधानी का एक छोटा और मीठा सामान्य शब्द !
लघु कथा:
निम्नलिखित काम करता है-कोई संदेह नहीं है, लेकिन अगर कोई एंबुलेबल्स किसी अंतर्निहित सरणी या सूची द्वारा समर्थित नहीं है, जो 'काउंट' है, जो आसान / प्री -कॉम्प्लेक्टेड है, तो छोटा प्रदर्शन जुर्माना हो सकता है :
public bool IsValid
{
get { return SomeMethodReturningEnumerable().Count() <= threshold; } <--- small performance issue here
}
public IEnumerable<SomeObject> SomeMethodReturningEnumerable(){
yield return foo;
yield return bar; etc
}
कॉल .Count () विधि संभवत: प्रत्येक और प्रत्येक आइटम के माध्यम से गणना करने योग्य है और फिर थ्रेशोल्ड से समग्र गणना की तुलना करेगी । हम चालाक होने के नाते थोड़ा बेहतर कर सकते हैं:
public bool IsValid
{
get { return !SomeMethodReturningEnumerable().HasMoreThan(threshold); } <--- neato!
}
public static bool HasLessThan<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count - 1);
public static bool HasLessOrEqualTo<T>(this IEnumerable<T> sequence, int count) => !sequence.HasMoreThan(count);
public static bool HasMoreOrEqualTo<T>(this IEnumerable<T> sequence, int count) => sequence.HasMoreThan(count - 1);
public static bool HasMoreThan<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: false);
public static bool HasExactly<T>(this IEnumerable<T> sequence, int count) => sequence.EnumerationCounterImpl(count, equals_vs_greaterThan: true);
public static bool EnumerationCounterImpl<T>(this IEnumerable<T> sequence, int count, bool equals_vs_greaterThan = true)
{
if (equals_vs_greaterThan && count < 0)
throw new ArgumentException($"{nameof(count)} is less than zero!");
if (!equals_vs_greaterThan && count < 0)
return true;
var staticCount = (sequence as ICollection)?.Count
?? (sequence as ICollection<T>)?.Count
?? (sequence as IReadOnlyCollection<T>)?.Count;
if (staticCount != null)
return staticCount > count;
using (var enumerator = sequence.GetEnumerator())
{
for (int i = 0; i < count + 1; i++)
{
if (enumerator.MoveNext())
continue;
return false;
}
return !equals_vs_greaterThan
|| enumerator.MoveNext();
}
}
वहाँ! समस्या फिर से हल हो गई लेकिन इस बार हम प्रदर्शन के प्रति सचेत हैं!