2

我的代码是这样的:

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

4

2 回答 2

6

您可以使用 LINQ:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength);

不幸的是,HttpFileCollection 的枚举器返回一个字符串枚举。为了获取实际的对象(HttpPostedFile),您需要按键访问“字典”。这会将枚举器转换为 HttpPostedFile 实例的枚举(通过 Select),然后对内容长度求和。

于 2010-03-04T16:36:22.533 回答
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 类定义。你会在这里找到这些方法(在我认为的其他地方)。

于 2010-03-04T16:54:45.253 回答