获取IEnumerable的长度?

mpe*_*pen 5 ironpython

IEnumerable<T>在IronPython中获取.net长度的最快方法是什么?Python标准len()函数似乎无法在其上运行。

我知道我能做

len(list(my_enumerable))
Run Code Online (Sandbox Code Playgroud)

要么

list(my_enumerable).Count
Run Code Online (Sandbox Code Playgroud)

但这可能比必要的要慢。

Jon*_*eet 7

您知道它是否真正实现了IEnumerable<T>吗?如果是这样,则可以使用Enumerable.Count(IEnumerable<T> source)(LINQ to Objects的一部分)。

我不知道非泛型的等效IEnumerable方法-尽管您可以很容易地实现这种方法。在C#中,它看起来像这样:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在最后放置迭代器很重要-但是您不能使用using语句,因为IEnumerator它本身没有实现IDisposable(与不同IEnumerator<T>)。

当然,您可以在类库中将其用作C#从IronPython进行调用,也可以自己将代码转换为IronPython。