获取IEnumerable的长度?

时间:2010-09-12 07:23:20

标签: ironpython

在IronPython中获取.net IEnumerable<T>长度的最快方法是什么? Python标准len()函数似乎不起作用。

我知道我能做到

len(list(my_enumerable))

list(my_enumerable).Count

但这可能比必要的慢。

1 个答案:

答案 0 :(得分:4)

你知道吗实际是否实现了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();
        }
    }
}

请注意,在最后处置迭代器非常重要 - 但您不能使用using语句,因为IEnumerator本身没有实现IDisposable(与{{1}不同})。

当然,你可以在类库中使用它作为C#来从IronPython调用,或者自己将代码翻译成IronPython。