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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top