Рассчитайте общую длину содержимого httpfilecollection с использованием выражений лямбда
-
24-09-2019 - |
Вопрос
Мой код имеет что-то подобное:
HttpFileCollection files
Вместо того, чтобы зацикливаться через каждый файл и добавление файла.ContentLength, чтобы получить общую длину всего контента, например,
int totalLength = 0;
for (int i = 0; i < files.Count; i++)
{
totalLength += files[i].ContentLength;
}
Есть ли способ сделать это с выражением лямбда, поэтому у меня есть что-то вроде ..
int totalLength = files.[some sort of delegate here to do the addition].
Заранее спасибо.
Редактировать: httpfilecollection имеет getenumeratormeThod, но ему нужно будет реализовать iEnumerable для использования лямбда-выражения?
Решение
Вы можете использовать LINQ:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
К сожалению, перечислетель httpFileCollection возвращает перечисление строк. Чтобы получить фактические объекты (httpPostedfile), вам нужно получить доступ к «словарю» по ключу. Это преобразует перечислетель в перечисление экземпляров httpPostedfile (через select), затем суммирует длину содержимого.
Другие советы
Вам нужно бросить его, как это:
int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);
Чтобы добавить в принятый ответ, действительно, вы можете использовать это:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
Причина, по которой вам не нужно перечислять в вашем коде, заключается в том, что метод расширения суммы делает это для вас. Если вы запускаете его через отражатель, вы в конечном итоге найдите этот бит кода:
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;
}
Как видите, это не совсем ракеты. Это почти так же, как ваш оригинальный код даже!
Примечание. Если вы хотите найти этот код, Crack Open System.Core, перейдите в пространство имен System.linq и откройте определение перечислимого класса. Вы найдете эти методы здесь (среди других мест, которые я думаю).