c# - الفرق بين عدد IEnumerable() والطول



ienumerable c# شرح (2)

إضافة صغيرة لتعليق جون سكيت .

فيما يلي التعليمة البرمجية المصدر لأسلوب ملحق Count() :

.NET 3:

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}

.NET 4:

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    ICollection is3 = source as ICollection;
    if (is3 != null)
    {
        return is3.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}

ما هي الاختلافات الرئيسية بين Count() IEnumerable Count() Length ؟


Answer #1

عن طريق استدعاء العد على IEnumerable<T> أفترض كنت تشير إلى طريقة تمديد Count على System.Linq.Enumerable . Length ليس طريقة على IEnumerable<T> بل خاصية على أنواع الصفيف في .Net مثل int[] .

الفرق هو الأداء. خاصية Length مضمونة لتكون عملية O (1). يختلف تعقيد طريقة Count استنادًا إلى نوع وقت التشغيل للكائن. سيحاول أن يلقي إلى عدة أنواع التي تدعم O طول (1) بحث مثل ICollection<T> عبر خاصية Count . إذا لم يكن أي منها متاحًا ، فسوف يعدد كل العناصر ويحسبها التي تحتوي على درجة تعقيد O (N).

فمثلا

int[] list = CreateSomeList();
Console.WriteLine(list.Length);  // O(1)
IEnumerable<int> e1 = list;
Console.WriteLine(e1.Count()); // O(1) 
IEnumerable<int> e2 = list.Where(x => x <> 42);
Console.WriteLine(e2.Count()); // O(N)

يتم تنفيذ القيمة e2 كمحرّر C # لا يدعم عملية العد (1) O ، وبالتالي يجب أن يقوم تعداد الطريقة بتعداد المجموعة بأكملها لتحديد طولها.





ienumerable