حساب إجمالي طول المحتوى من HTTPFileCollection باستخدام تعبيرات Lambda

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

سؤال

الكود الخاص بي يحتوي على شيء مثل هذا:

HttpFileCollection files

بدلاً من الحلق عبر كل ملف وإضافة الملف. الطول للحصول على الطول الإجمالي لجميع المحتوى على سبيل المثال

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

هل هناك طريقة يمكنني القيام بذلك بتعبير lambda لذلك لدي شيء مثل ..

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

شكرا لك مقدما.

تحرير: httpfileCollection لديه getenumeratormethod ولكن هل سيكون من المفيد تنفيذ ienumerable لاستخدام تعبير lambda؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام 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);

السبب الذي يجعلك مضطرًا إلى التعداد في الكود الخاص بك هو أن طريقة تمديد المجموع تفعل ذلك من أجلك. إذا قمت بتشغيله عبر 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;
}

كما ترون ، إنه ليس حقًا روكتس. إنه نفس الرمز الأصلي الخاص بك تقريبًا!

ملاحظة: إذا كنت ترغب في العثور على هذا الرمز ، فقم Crack Open System.core ، انتقل إلى مساحة الاسم System.LinQ وفتح تعريف الفئة التعويضية. ستجد هذه الطرق هنا (من بين أماكن أخرى على ما أعتقد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top