计算IEnumerable <httppostedfilebase> </httppostedfilebase>的非null元素

时间:2012-11-16 17:24:07

标签: c# asp.net-mvc-3 count ienumerable httppostedfilebase

我在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中已有功能。

3 个答案:

答案 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放入它自己的方法中,那么它也会降低可读性,因此仅靠(通常很小的)性能优势是不值得的。