2

asp .netmvc3にビューモデルがあります。

IEnumerable<HttpPostedFileBase> files

ビューには、これらのファイルの9つの入力タグを作成するforループがあります。

サーバー側でチェックを実装して、少なくとも3つのファイルがアップロードされていることを確認したいと思います。

条件をつけてみました

if(files.Count() > 2) { // code here } 

ただし、null要素もカウントするため、9が返されます。

私は以下のように自分でカウンターを実装することを考えることができます:

int count = 0;
@foreach(var file in files) {
  if(file != null && file.ContentLength > 0) { 
    count++; 
  }
}

これはこれを行うための最良の方法ですか、それともこのためのasp.netmvcにすでに機能がありますか。

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 に答える