Calculer la longueur du contenu total de HttpFileCollection en utilisant des expressions Lambda
-
24-09-2019 - |
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
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).