حساب إجمالي طول المحتوى من HTTPFileCollection باستخدام تعبيرات Lambda
-
24-09-2019 - |
سؤال
الكود الخاص بي يحتوي على شيء مثل هذا:
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 وفتح تعريف الفئة التعويضية. ستجد هذه الطرق هنا (من بين أماكن أخرى على ما أعتقد).