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.