使用Lambda表达式HttpFileCollection的计算总含量长度
-
24-09-2019 - |
题
我的码具有这样的:
HttpFileCollection files
而不是通过每个文件循环和添加了file.ContentLength获取所有内容的总长度的e.g。
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的枚举实例(通过选择),然后求和内容长度。
其他提示
您需要转换,就像这样:
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;
}
正如你看到的,这不是真的rocketscience。这几乎与您的原代码,甚至!
请注意:如果你想找到这段代码,裂开System.Core程序,进入System.Linq的命名空间,并打开枚举类定义。您会在这里发现这些方法(在其他地方,我认为)。
不隶属于 StackOverflow