使用Lambda表达式计算HttpFileCollection的总内容长度

时间:2010-03-04 16:34:17

标签: c# lambda delegates httpfilecollection

我的代码有这样的内容:

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表达式吗?

3 个答案:

答案 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类定义。你会在这里找到这些方法(我想其他地方)。