Получить длину IEnumerable? - PullRequest
       4

Получить длину IEnumerable?

3 голосов
/ 12 сентября 2010

Какой самый быстрый способ получить длину .net IEnumerable<T> в IronPython?Стандартная функция Python len(), похоже, не работает на ней.

Я знаю, что могу сделать

len(list(my_enumerable))

или

list(my_enumerable).Count

Но это может бытьмедленнее, чем необходимо.

1 Ответ

5 голосов
/ 12 сентября 2010

Знаете ли вы, если это на самом деле реализует 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 (в отличие от IEnumerator<T>).

Конечно, вы можете использовать это как C # в библиотеке классов для вызова из IronPython или перевести код на IronPython самостоятельно.

...