5 Stimmen

Länge von IEnumerable? abfragen

Wie kann ich am schnellsten die Länge einer .net-Datei ermitteln? IEnumerable<T> in IronPython? Der Python-Standard len() Funktion scheint damit nicht zu funktionieren.

Ich weiß, dass ich es kann

len(list(my_enumerable))

ou

list(my_enumerable).Count

Aber das könnte langsamer sein als nötig.

7voto

Jon Skeet Punkte 1325502

Wissen Sie, ob es eigentlich implementiert IEnumerable<T> ? Wenn ja, könnten Sie Folgendes verwenden Enumerable.Count(IEnumerable<T> source) (Teil von LINQ to Objects).

Ich kenne keine Entsprechung für die nicht-generische IEnumerable - obwohl Sie eine solche Methode leicht selbst implementieren könnten. In C# würde es etwa so aussehen:

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();
        }
    }
}

Beachten Sie, dass das Entsorgen des Iterators am Ende wichtig ist - aber Sie können keine using Anweisung als IEnumerator selbst implementiert nicht IDisposable (im Gegensatz zu IEnumerator<T> ).

Natürlich könnten Sie das entweder als C# in einer Klassenbibliothek verwenden, die Sie von IronPython aus aufrufen, oder den Code selbst in IronPython übersetzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X