Рассчитайте общую длину содержимого httpfilecollection с использованием выражений лямбда

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

Вопрос

Мой код имеет что-то подобное:

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 и откройте определение перечислимого класса. Вы найдете эти методы здесь (среди других мест, которые я думаю).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top