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)
但这可能比必要的要慢。
您知道它是否真正实现了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。