Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get length of IEnumerable?

Tags:

ironpython

What's the fastest way to get the length of an .net IEnumerable<T> in IronPython? The Python standard len() function doesn't seem to work on it.

I know I can do

len(list(my_enumerable))

or

list(my_enumerable).Count

But that might be slower than necessary.

like image 522
mpen Avatar asked Sep 12 '10 07:09

mpen


1 Answers

Do you know if it actually implements IEnumerable<T>? If so, you could use Enumerable.Count(IEnumerable<T> source) (part of LINQ to Objects).

I don't know of an equivalent for the non-generic IEnumerable - although you could implement such a method yourself easily enough. In C# it would look something like this:

public static int Count(IEnumerable source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    // Optimization for ICollection implementations (e.g. arrays, ArrayList)
    ICollection collection = source as ICollection;
    if (collection != null)
    {
        return collection.Count;
    }

    IEnumerator iterator = source.GetEnumerator();
    try
    {
        int count = 0;
        while (iterator.MoveNext())
        {
            count++;
        }
        return count;
    }
    finally
    {
        IDisposable disposable = iterator as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }
}

Note that disposing of the iterator at the end is important - but you can't use a using statement as IEnumerator itself doesn't implement IDisposable (unlike IEnumerator<T>).

Of course you could either use that as C# in a class library to call from IronPython, or translate the code into IronPython yourself.

like image 72
Jon Skeet Avatar answered Sep 29 '22 00:09

Jon Skeet