2016-12-16 4 views
1

Donc, je travaillais sur un programme et j'étais un peu confus sur le comportement d'un opérateur de liste. J'ai une liste et je voulais savoir si elle contient une entrée selon certains critères. Maintenant, nous allons l'appeler une liste et obj a les propriétés suivantes:C# List.Exists renvoie true avec "false && true"

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

Maintenant, je voulais seulement un vrai résultat si propA était égal à un dans la liste et si la propriété dans la liste a comme propC il doit vérifier PropC, sinon PropB. Je utilisé ce morceau de code pour elle:

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; 
})) 

Après la première ligne avec les « PropA.Equals ... » b a été définie sur false. Mais la ligne au-delà l'a rendu à nouveau vrai. Donc, il semblait qu'il y avait un objet, même si ce n'était pas le cas. J'ai trouvé une solution pour cela, j'ai enveloppé la deuxième ligne après le & & -Operator entre parenthèses mais je ne sais toujours pas pourquoi il est fait d'un faux un vrai.

Pouvez-vous me donner un indice sur celui-ci?

Merci.

+0

Vous devez le remplacer par 'b = b && (x.HasPropC? X.PropC.Equals (obj.PropC): x.PropB.Equals (obj.PropB));' Sinon, c'est ANDing 'b' et 'x.HasPropC' et en utilisant cela pour déterminer quelle partie du conditionnel exécuter et assigner' b'. – juharr

Répondre

6

Dans l'expression

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

L'opérateur && a priorité sur l'opérateur ?:. Ainsi, lorsque vous l'avez évalué, b && x.HasPropC a été évalué à faux, et b a été affecté avec la valeur x.PropB.Equals(obj.PropB).

+0

@HimBromBeere OP a déjà expliqué qu'il a réussi à résoudre le problème (en utilisant des accolades pour désactiver la priorité de l'opérateur), et demandait simplement des éclaircissements sur la raison pour laquelle cela se produisait. – matanso