我在asp .net mvc 3中有一个视图模型,其中有
IEnumerable<HttpPostedFileBase> files
在视图中,我有一个for循环,为这些文件创建了9个输入标记。
我想在服务器端执行检查,以确保上传至少3个文件。
我尝试了一个条件
if(files.Count() > 2) { // code here }
然而,它返回9,因为它也计算空元素。
我可以考虑自己实施一个计数器如下:
int count = 0;
@foreach(var file in files) {
if(file != null && file.ContentLength > 0) {
count++;
}
}
这是执行此操作的最佳方式,还是asp .net mvc中已有功能。
答案 0 :(得分:6)
files.Count(file=>file != null && file.ContentLength > 0);
答案 1 :(得分:3)
使用谓词来过滤计数:
files.Where(file => file != null).Count()
或者更简单,只需files.Count(file => file != null)
。
答案 2 :(得分:1)
每当你看到enumerable.Count() > X
的范例时,你可以使用以下方法,只要你知道你有足够的物品,就可以立即结束:
public static bool HasAtLeast<T>(IEnumerable<T> source, int number)
{
return source.Skip(number - 1).Any();
}
鉴于这种方法你可以写:
if(files.Where(file => file != null && file.ContentLength > 0)
.HasAtLeast(2))
{
//code goes here
}
现在,这是一项重大改进,不,可能不是。您需要执行此代码很多次,数千次,有一个巨大的枚举,或者枚举成本很高(如果它是LINQ查询执行长运行方法的结果)物。如果你没有将HasAtLeast
放入它自己的方法中,那么它也会降低可读性,因此仅靠(通常很小的)性能优势是不值得的。