在IronPython中获取.net IEnumerable<T>
长度的最快方法是什么? Python标准len()
函数似乎不起作用。
我知道我能做到
len(list(my_enumerable))
或
list(my_enumerable).Count
但这可能比必要的慢。
答案 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。