【问题标题】:count non-null elements of IEnumerable<HttpPostedFileBase>计算 IEnumerable<HttpPostedFileBase> 的非空元素
【发布时间】:2012-11-05 11:08:36
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    files.Count(file=>file != null && file.ContentLength > 0);
    

    【讨论】:

    • @Tripping 不,我不会比你的循环更糟(我不是说它不好。)
    • 我应该使用列表和长度来代替吗?我对 asp .net 或一般的 web 开发非常陌生,并且正在阅读使用 count 不是一个好主意。非常感谢
    • @Tripping 在考虑微优化之前,请尝试编写可读/可维护的代码。当您检查 null 和 ContentLength 时,您将不得不遍历列表并且 Linq 不会变慢。
    • @Tripping 您的列表中是否有几十万(或百万)项,或者您是否执行了几十万次此操作?如果是这样,可能有更好的方法(您可以使用 SkipAny() 来缩短操作并提前结束)但是即使使用简单的算法,您的代码也可能足够快。
    • 你为什么不把你的模型改成List&lt;HttpPostedFileBase&gt;并在上面调用.Count属性
    【解决方案2】:

    使用谓词过滤计数:

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

    或者更简单,就是files.Count(file =&gt; file != null)

    【讨论】:

      【解决方案3】:

      任何时候你看到enumerable.Count() &gt; 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 放入它自己的方法中,它也会降低可读性,因此仅凭这一点就不值得(通常很小的)性能优势。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-02
        • 2020-10-22
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        相关资源
        最近更新 更多