计算总的内容长度表达式

计算总的内容长度表达式

问题描述:

我的代码有这样的事情:计算总的内容长度表达式

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

你可以使用LINQ:

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

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

+0

嗨,只是为了理解,为什么我不需要遍历文件和转换?是否有某种自动枚举发生在集合上?尽管阅读“C#深度”,但还没有完全掌握这个:) – Remotec 2010-03-04 16:46:53

+0

HttpFileCollection实现IEnumerable,所以你可以枚举它作为“对象”。上面的LINQ语句执行内联,然后处理你的总和。它在内部基本上与执行foreach相同,转换为HttpPostedFile,然后求和ContentLength(但更易于读写)。 – 2010-03-04 16:53:22

+0

mmm - 这应该不会发生,给你上面发布的代码...你确定“文件”是一个HttpFileCollection,而不是一个字符串的集合,不知何故? – 2010-03-04 16:57:19

你需要转换,就像这样:

int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength); 
+0

这实际上不起作用 - files.GetEnumerator返回一个IEnumerable,它是字符串值。 – 2010-03-04 17:31:32

+1

@Reed Copsey,你是对的。 'HttpFileCollection'是一个完全搞砸的集合。 – 2010-03-04 19:26:23

要添加到接受的答案,事实上,你可以使用这个:

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

为什么你没有理由枚举在您的代码是因为Sum扩展方法为您做。如果通过反射运行它,你最终找到这段代码:

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命名空间并打开Enumerable类定义。你会在这里找到这些方法(我认为其他地方)。

+0

这实际上不起作用 - files.GetEnumerator返回一个IEnumerable,它是字符串值 – 2010-03-04 17:32:25

+0

啊,我看到你编辑了你的答案。我会相应地更新我的。谢谢 :) – 2010-03-04 19:21:09