2

我在 asp .net mvc 3 中有一个视图模型

IEnumerable<HttpPostedFileBase> files

在视图中,我有一个为这些文件创建 9 个输入标签的 for 循环。

我想在服务器端进行检查,以确保至少上传了 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 中已经为此提供了功能。

4

3 回答 3

6
files.Count(file=>file != null && file.ContentLength > 0);
于 2012-11-16T17:26:26.767 回答
4

使用谓词过滤计数:

files.Where(file => file != null).Count()

或者更简单,只是files.Count(file => file != null)

于 2012-11-16T17:27:26.330 回答
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它自己的方法,它也会降低可读性,因此仅此一项就不值得(通常很小)的性能优势。

于 2012-11-16T17:37:13.037 回答