计算总的内容长度表达式
我的代码有这样的事情:计算总的内容长度表达式
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),然后总和内容长度。
你需要转换,就像这样:
int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength);
这实际上不起作用 - files.GetEnumerator返回一个IEnumerable,它是字符串值。 – 2010-03-04 17:31:32
@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类定义。你会在这里找到这些方法(我认为其他地方)。
这实际上不起作用 - files.GetEnumerator返回一个IEnumerable,它是字符串值 – 2010-03-04 17:32:25
啊,我看到你编辑了你的答案。我会相应地更新我的。谢谢 :) – 2010-03-04 19:21:09
嗨,只是为了理解,为什么我不需要遍历文件和转换?是否有某种自动枚举发生在集合上?尽管阅读“C#深度”,但还没有完全掌握这个:) – Remotec 2010-03-04 16:46:53
HttpFileCollection实现IEnumerable,所以你可以枚举它作为“对象”。上面的LINQ语句执行内联,然后处理你的总和。它在内部基本上与执行foreach相同,转换为HttpPostedFile,然后求和ContentLength(但更易于读写)。 – 2010-03-04 16:53:22
mmm - 这应该不会发生,给你上面发布的代码...你确定“文件”是一个HttpFileCollection,而不是一个字符串的集合,不知何故? – 2010-03-04 16:57:19