Domanda

Il mio codice ha qualcosa di simile:

HttpFileCollection files

Invece di loop attraverso ogni file e sommando il file.ContentLength per ottenere la lunghezza totale di tutti i contenuti per es.

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

C'è un modo che io possa fare questo con un'espressione lambda così ho qualcosa di simile ..

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

Grazie in anticipo.

Modifica:? HttpFileCollection ha un GetEnumeratorMethod ma sarebbe necessario implementare IEnumerable ad utilizzare un'espressione lambda

È stato utile?

Soluzione

È possibile utilizzare LINQ:

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

Purtroppo, di HttpFileCollection enumerator restituisce un'enumerazione di stringhe. Al fine di ottenere gli oggetti reali (HttpPostedFile), è necessario accedere al "dizionario" di chiave. Questo trasforma l'enumeratore un'enumerazione di HttpPostedFile istanze (via Select), poi riassume la lunghezza del contenuto.

Altri suggerimenti

È necessario lanciarlo, in questo modo:

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

Per aggiungere alla risposta accettata, infatti, è possibile utilizzare questo:

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

Il motivo per cui non si dispone di enumerare nel codice è perché il metodo di estensione Somma che fa per voi. Se si esegue attraverso Reflector alla fine si trova questo pezzo di codice:

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

Come si vede, non è davvero rocketscience. E 'quasi lo stesso il tuo codice originale anche!

Nota: Se si desidera trovare il codice, crack System.Core aperta, andare al namespace System.Linq e aprire la definizione della classe Enumerable. Troverete questi metodi qui (tra l'altro credo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top