开发者

Get length of IEnumerable?

What's the fa开发者_高级运维stest 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.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜