Frage

Mein Code hat so etwas wie folgt aus:

HttpFileCollection files

Statt durch jede Datei Looping und die file.ContentLength Hinzufügen von bis zu die Gesamtlänge aller Inhalte z zu erhalten.

        int totalLength = 0;
        for (int i = 0; i < files.Count; i++)
        {
            totalLength += files[i].ContentLength;
        }

Gibt es eine Weise, die ich dies mit einem Lambda-Ausdruck tun können, so dass ich so etwas wie habe ..

int totalLength = files.[some sort of delegate here to do the addition].

Vielen Dank im Voraus.

Edit:? HttpFileCollection eine GetEnumeratorMethod hat aber würde es brauchen IEnumerable zu implementieren einen Lambda-Ausdruck zu verwenden,

War es hilfreich?

Lösung

Sie können LINQ verwenden:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);

Leider HttpFileCollection der Enumerator gibt eine Aufzählung von Strings. Um die eigentlichen Objekte (HttpPostedFile) zu bekommen, müssen Sie mit dem Schlüssel das „Wörterbuch“ zuzugreifen. Dieser wandelt der Enumerator auf eine Aufzählung von HttpPostedFile Instanzen (via Select), summiert dann die Inhaltslänge.

Andere Tipps

Sie müssen es werfen, wie folgt aus:

int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);

auf die akzeptierte Antwort hinzuzufügen, in der Tat, können Sie diese verwenden:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);

Der Grund, warum Sie nicht in Ihrem Code aufzuzählen ist, weil die Sum-Extension-Methode, die für Sie tut. Wenn Sie es durch Reflektor laufen schließlich Sie dieses Stück Code finden:

public static int Sum(this IEnumerable<int> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    int num = 0;
    foreach (int num2 in source)
    {
        num += num2;
    }
    return num;
}

Wie Sie sehen, ist es nicht wirklich Rocketscience. Es ist fast die gleiche wie Ihr Original-Code selbst!

Hinweis: Wenn Sie diesen Code finden wollen, knacken System.Core, gehen Sie zum System.Linq Namespace und öffnen Sie die Enumerable Klassendefinition. Sie finden diese Methoden finden Sie hier (unter anderem glaube ich).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top