Calculer la longueur du contenu total de HttpFileCollection en utilisant des expressions Lambda

StackOverflow https://stackoverflow.com/questions/2380946

Question

Mon code a quelque chose comme ceci:

HttpFileCollection files

Au lieu de boucle à travers chaque fichier et en ajoutant le file.ContentLength pour obtenir la longueur totale de tous les contenus par exemple.

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

Est-il possible que je peux le faire avec une expression lambda donc j'ai quelque chose comme ..

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

Merci d'avance.

Modifier: HttpFileCollection a une GetEnumeratorMethod mais serait-il nécessaire de mettre en œuvre IEnumerable d'utiliser une expression lambda

Était-ce utile?

La solution

Vous pouvez utiliser LINQ:

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

Malheureusement, recenseur de HttpFileCollection retourne une énumération des chaînes. Afin d'obtenir les objets réels (HttpPostedFile), vous devez accéder au « dictionnaire » par clé. Il convertit le recenseur à une énumération des instances de HttpPostedFile (via Select), puis la longueur résume de contenu.

Autres conseils

Vous devez jeter, comme ceci:

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

Pour ajouter à la réponse acceptée, en effet, vous pouvez utiliser ceci:

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

La raison pour laquelle vous n'avez pas d'énumérer dans votre code est parce que la méthode d'extension Somme fait pour vous. Si vous exécutez par réflecteur vous trouvez finalement ce morceau de code:

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

Comme vous le voyez, ce n'est pas vraiment Rocketscience. Il est presque le même que votre code d'origine, même!

Remarque: Si vous voulez trouver ce code, le crack System.Core ouvert, passez à l'espace de noms System.Linq et ouvrez la définition de classe Enumerable. Vous trouverez ces méthodes ici (je pense entre autres).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top