Calcule o comprimento total do conteúdo de httpfileCollection usando expressões lambda
-
24-09-2019 - |
Pergunta
Meu código tem algo assim:
HttpFileCollection files
Em vez de fazer loop através de cada arquivo e adicionar o arquivo.contentLength para obter a duração total de todo o conteúdo, por exemplo,
int totalLength = 0;
for (int i = 0; i < files.Count; i++)
{
totalLength += files[i].ContentLength;
}
Existe uma maneira de fazer isso com uma expressão de lambda, então eu tenho algo como ..
int totalLength = files.[some sort of delegate here to do the addition].
Desde já, obrigado.
EDIT: HttpFileCollection tem um getenumeratortorthod, mas precisaria implementar o iEnumerable para usar uma expressão de lambda?
Solução
Você poderia usar o Linq:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
Infelizmente, o enumerador da HttpFileCollection retorna uma enumeração de cordas. Para obter os objetos reais (httppotedfile), você precisa acessar o "dicionário" por chave. Isso converte o enumerador em uma enumeração de instâncias HTTPPOSTEDFILE (via seleção) e resume o comprimento do conteúdo.
Outras dicas
Você precisa lançá -lo assim:
int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);
Para adicionar à resposta aceita, de fato, você pode usar isso:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
A razão pela qual você não precisa enumerar em seu código é porque o método de extensão da soma faz isso para você. Se você o executar através do refletor, encontrará esse bit de código:
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;
}
Como você vê, não é realmente o RocketScience. É quase o mesmo que o seu código original até!
Nota: Se você deseja encontrar este código, crack open System.core, vá para o espaço de nome System.Linq e abra a definição de classe enumerável. Você encontrará esses métodos aqui (entre outros lugares, acho).