2012-03-16 3 views
0

例えばリスト項目の数が必要ですが、それは ""ではありません。 ATMは、私はこのようにそれを解決する:特定の基準を満たすリストアイテムの数を取得するにはどうすればよいですか?

public int getRealCount() 
    { 
     List<string> all = new List<string>(originList); 
     int maxall = all.Count; 
     try 
     { 
      for (int i = 0; i < maxall; i++) 
      { 
       all.Remove(""); 
      } 
     } 
     catch { } 
     return all.Count; 
    } 

疑い、パフォーマンスはかなり悪いです。私はそれがちょうど10アイテムのリストですが、電話であなたはそのようなコードを避ける必要があります幸運です。

私の質問は、このコードをどのように改善できますか?

1つのアイデアがありました。既にそのための方法が存在する可能性があります。 econdメソッドは、すべてが ""ではないアイテムだけでいっぱいになる可能性があります。

どうすれば解決できますか?

+0

でもないだろうか?パフォーマンスのためにそれを試してください – gaussblurinc

答えて

5

はあなたのような音

おかげで欲しい:

return originList.Count(x => x != ""); 

ですべてのコレクションのコピーを作成する必要はありません。ソースコードの最初に、使用するディレクティブにusing System.Linq;が必要であることに注意してください。

(あなたがないそのような空のcatchブロックを持っている必要があることに注意してください - 。それはそのように例外を抑制するひどいアイデアだあなたがしたいときは、どちらか本当に彼らにを扱うしたい場合や、唯一の例外をキャッチ

+0

うわー、それは簡単だろうとは思わなかった。どうもありがとう! – roqstr

1

リストのすべてのアイテムすべてに対してall.remove( "")を呼び出しているとします。なぜそれを一度呼び出さないのですか?あなたは...あなたのコード内でのすべてのIを使用していない

なぜ

は私が持っていた問題を修正しました:

public int getRealCount() 
    { 
     List<string> all = new List<string>(originList); 

     int erased =all.RemoveAll(delegate(string s) 
     { 
      return s == ""; 
     }); 

     return all.Count - erased; 
    } 

更新。これはラムダなしです。

+0

空の文字列が複数あった場合、それはうまくいかないでしょう。 –

1

LINQを使用する必要があります。 ReSharperをインストールすると、それが生成されます。

また、int maxall = all.Countを作成せずにforループで使用してください。

モバイルアプリの場合、不要なメモリを使用しないでください。forループでall.Countを使用してください。

2

パフォーマンスが懸念される場合は、これらのアイテムのみのコレクションを保持する必要があります。

パフォーマンスがあまり重要でない場合は、コレクションでLinqクエリを使用することをお勧めします。 Linqのすばらしい点は、検索が必要になるまで遅れることです。

int nonEmptyItemCount = originList.Count(str => !string.IsNullOrEmpty(str)); 

あなたは多分リストのfindAllの機能が最良の

int nonEmptyItemCount = originList.Count(str => str != ""); 
+0

Countは、IEnumerable ではなく、intを返します。 –

+0

D'oh!修正しました。それを指摘してくれてありがとう! –

関連する問題