Calcolare la lunghezza totale contenuto di HttpFileCollection usando le espressioni lambda
-
24-09-2019 - |
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
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).