2011-08-16 10 views
0

基準のセットに基づいてリスト内のオブジェクトを検索しようとしています。基本的なロジックは次のようになりますif文を使用して条件を作成するエレガントな方法

for (objectx obj : list) 
{ 
    if (object.property1 > criteria1) 
     //accept object 
    else (object.property1 == criteria1) 
    { 
     if (object.property2 > criteria2) 
      //accept object 
     else (object.property2 == criteria2) 
     { 
      if (object.property3 > criteria3) 
        ... etc 
     } 
    }         
} 

この混乱を単純化するエレガントな方法がありますか?

+0

これは間違ってインデントされていますか、括弧が欠落していますか? –

+0

私は中括弧がありません –

+0

目的の論理についてあいまいさと疑念を避けるために、1つの文行に対しても常に 'Parenthesis'を置くべきです! –

答えて

1
boolean accept = false; 
for (int i = 0; i < object.numProps(); i++) { 
    if (object.prop[i] > criteria[i]) { 
     accept = true; 
     break; 
    } else if (object.prop[i] < criteria[i]) 
     break; 
    // loop continues only if object.prop[i] == criteria[i] 
} 
0

私はあなたのループ内で、その後のすべてのプロパティをチェックする方法を作成することになりますが、単純に言うことができる:

for (objectx obj : list) 
{ 
    if(checkProperties(obj)) 
    { 
     //Do Stuff 
    } 
} 
0

は、ビジネスロジックを助けることにちなんで名付けられたメソッドを追加します。それから、コードを読むことは英語のように読むべきであり、実際の比較は別の場所にあるはずです。それはあまりにも簡単に考えることができます。

0

私が以前にしたようなことをしたいのなら、それは助けになるでしょう。私はあなたのようにNHibernateを使ってデータベース内のオブジェクトを検索したかったのです。ユーザーが入力したすべての条件を収集するQueryオブジェクトを作成しました。そして、私がQueryオブジェクトに関連するプロパティを設定するとき、私はこのような基準をこのように追加しました。

public bool Archive 
    { 
     set 
     { 
      if(value) 
      { 
       criteria.Add(Restrictions.Eq("Archive", true)); 
      } 
     } 
    } 

    public bool IsFavorite 
    { 
     set 
     { 
      if (value) 
      { 
       criteria.Add(Restrictions.Eq("IsFavorite", true)); 
      } 
     } 
    } 

メモリ内のオブジェクトをフィルタリングしたい場合は、 Specification Patternを使用することもできます。

関連する問題