Рассчитать общую длину содержимого HttpFileCollection с помощью лямбда-выражений - PullRequest
2 голосов
/ 04 марта 2010

Мой код выглядит примерно так:

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 использование лямбда-выражения?

Ответы [ 3 ]

6 голосов
/ 04 марта 2010

Вы можете использовать LINQ:

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

К сожалению, перечислитель HttpFileCollection возвращает перечисление строк. Чтобы получить реальные объекты (HttpPostedFile), вам нужно получить доступ к «словарю» по ключу. Это преобразует перечислитель в перечисление экземпляров HttpPostedFile (через Select), а затем суммирует длину содержимого.

1 голос
/ 04 марта 2010

Чтобы добавить к принятому ответу, действительно, вы можете использовать это:

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

Причина, по которой вам не нужно перечислять в своем коде, заключается в том, что метод расширения Sum делает это за вас. Если вы запустите его через Reflector, вы в конечном итоге найдете этот фрагмент кода:

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

Как видите, на самом деле это не ракетостроение. Это почти так же, как ваш оригинальный код даже!

Примечание. Если вы хотите найти этот код, откройте System.Core, перейдите в пространство имен System.Linq и откройте определение класса Enumerable. Вы найдете эти методы здесь (среди других мест, я думаю).

1 голос
/ 04 марта 2010

Вы должны разыграть его, как это:

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