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

发布于 2024-08-23 10:11:11 字数 554 浏览 6 评论 0原文

我的代码有这样的内容:

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

My code has something like this:

HttpFileCollection files

Instead of looping through each file and adding up the file.ContentLength to get the total length of all content e.g.

        int totalLength = 0;
        for (int i = 0; i < files.Count; i++)
        {
            totalLength += files[i].ContentLength;
        }

Is there a way I can do this with a lambda expression so I have something like..

int totalLength = files.[some sort of delegate here to do the addition].

Thanks in advance.

Edit: HttpFileCollection has a GetEnumeratorMethod but would it need to implement IEnumerable to use a lambda expression?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长途伴 2024-08-30 10:11:11

您可以使用 LINQ:

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

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

You could use LINQ:

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

Unfortunately, HttpFileCollection's enumerator returns an enumeration of strings. In order to get the actual objects (HttpPostedFile), you need to access the "dictionary" by key. This converts the enumerator to an enumeration of HttpPostedFile instances (via Select), then sums the content length.

余罪 2024-08-30 10:11:11

事实上,要添加到已接受的答案中,您可以使用以下方法:

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 类定义。您可以在这里找到这些方法(我认为还有其他地方)。

To add to the accepted answer, indeed, you can use this:

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

The reason why you don't have to enumerate in your code is because the Sum extension method does that for you. If you run it through Reflector you eventually find this bit of code:

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;
}

As you see ,it's not really rocketscience. It's almost the same as your original code even!

Note: If you want to find this code, crack open System.Core, go to the System.Linq namespace and open the Enumerable class definition. You'll find these methods here (among other places I think).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文