2016-12-16 21 views
1

私はプログラムで作業していたので、Listoperatorの動作についてちょっと混乱しました。私はリストを持っており、それがいくつかの基準に従ってエントリーを保持しているかどうかを知りたがっています。 は、今度はリストにそれを呼ぼうとOBJ、次のプロパティがありますがpropaは、リスト内の1に等しかったとリストのプロパティがPropCとして持っている場合、それがチェックする必要がある場合c#List.Existsは "false && true"でtrueを返します

public string PropA { get; set; } 
public string PropB { get; set; } 
public string PropC { get; set; } 
public bool HasPropC { get; set; } 

は今、私は唯一の真の結果を望んでいましたPropC、そうでなければPropB。 は、私はそれのためのコードのこの部分を使用:

if (List.Exists(x => { 
     bool b = true; 

     b = b && x.PropA.Equals(obj.PropA); 
     b = b && x.HasPropC ? x.PropC.Equals(obj.PropC) : x.PropB.Equals(obj.PropB); 

     return b; 
})) 

を持つ最初の行の後に「PropA.Equals ...」bがfalseに設定されました。しかし、それ以来、それは再び真実でした。だから、そうではなくてもオブジェクトがあるように見えました。私はそれのための解決策を見つけた、私は& &オペレータの後に2番目の行を括弧で囲んだが、私はまだそれが真実から成った理由を知らない。

私にこのヒントを教えてもらえますか?

ありがとうございました。式において

+0

これを 'b = b &&(x.HasPropC?x.PropC.Equals(obj.PropC):x.PropB.Equals(obj.PropB));に変更する必要があります。 'x.HasPropC'を呼び出し、それを使って条件のどの部分を実行し、' b'に割り当てるかを決定します。 – juharr

答えて

6

b && x.HasPropC ? x.PropC.Equals(obj.PropC) : x.PropB.Equals(obj.PropB); 

&&オペレータは?:演算子よりも優先されます。したがって、評価すると、b && x.HasPropCが偽に評価され、bに値がx.PropB.Equals(obj.PropB)が割り当てられました。

+0

@HimBromBeere OPはすでに問題の解決に取り組んでおり(オペレータの優先順位を無効にするために中かっこを使用しています)、なぜこれが起こったのかを明確にすることを求めていました。 – matanso

関連する問題