Pregunta

Mi código tiene algo como esto:

HttpFileCollection files

En lugar de bucle a través de cada archivo y sumando el file.ContentLength para obtener la longitud total de todos los contenidos por ejemplo.

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

¿Hay alguna manera de hacer esto con una expresión lambda, así que tengo algo así ..

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

Gracias de antemano.

Editar:? HttpFileCollection tiene un GetEnumeratorMethod pero habría que necesita para implementar IEnumerable utilizar una expresión lambda

¿Fue útil?

Solución

Se puede utilizar LINQ:

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

Por desgracia, de HttpFileCollection empadronador devuelve una enumeración de cadenas. Con el fin de conseguir los objetos reales (HttpPostedFile), es necesario para acceder al "diccionario" por la clave. Esto convierte el empadronador a una enumeración de HttpPostedFile casos (a través de Select), a continuación, resume la longitud del contenido.

Otros consejos

Es necesario para su emisión, así:

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

Para añadir a la respuesta aceptada, de hecho, puede utilizar lo siguiente:

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

La razón por la que no tiene que enumerar en su código se debe a que el método de extensión Suma lo hace por usted. Si se ejecuta a través del reflector finalmente encuentras este trozo 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 se ve, en realidad no es RocketScience. Es casi el mismo que el código original, incluso!

Nota: Si usted quiere encontrar este código, el crack System.Core abierta, vaya al espacio de nombres System.Linq y abrir la definición de clase Enumerable. Encontrará estos métodos aquí (entre otros lugares, creo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top