我的代码有这样的内容:
HttpFileCollection files
而不是循环遍历每个文件并添加file.ContentLength来获取所有内容的总长度,例如
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表达式吗?
答案 0 :(得分:6)
您可以使用LINQ:
int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);
不幸的是,HttpFileCollection的枚举器返回字符串的枚举。为了获取实际对象(HttpPostedFile),您需要按键访问“词典”。这会将枚举数转换为HttpPostedFile实例的枚举(通过Select),然后对内容长度求和。
答案 1 :(得分:1)
你需要施展它,如下:
int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);
答案 2 :(得分:1)
要添加到接受的答案中,您确实可以使用:
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类定义。你会在这里找到这些方法(我想其他地方)。