2009-07-18 6 views
0

Y at-il un moyen rapide de direYat-il un moyen rapide de dire si notempty x = y reste x = défaut dans une Linq où la requête

Where (data.x == (If notempty x = y else x = default)) 

En supposant que les données par rapport à la fois les chaînes

Compare listitem.string with passed.string - if passed.string isnotempty, else passed.string equals default value. 

dans une requête Linq 'where`. Excuses que la question était vraiment mal écrite.

... Selon les commentaires mis à jour ...

+1

Vous devriez être un peu plus expressif quant à ce que représentent «x» et «y» et quel est leur type réel. –

+0

Vous avez assignation et égalité dans l'expression? –

+0

Pourriez-vous clarifier ce à quoi se réfère le 'nonempty'? – Noldorin

Répondre

3

Ok, avec vos clarifications à l'article original, je pense que je vois ce que vous obtenez maintenant.

Essayez la clause suivante (où data.x est votre élément actuel et y dans l'argument passé).

where y == (string.IsNullOrEmpty(y) ? "default" : data.x) 

Je ne crois pas qu'il soit possible d'utiliser l'opérateur coalescent nul ici, puisque les variables que vous comparez et de retour sont différents.

Ancien poste:
Si vide? Je suppose que vous faites référence à y.

Pour un type générique T, vous pouvez utiliser la clause suivante:

where data.x == (y ?? DefaultValue<T>()) 

DefaultValue est une fonction générique de T qui retourne une valeur dite « par défaut ».

+0

'(y ?? default (T))' est '(y! = Par défaut (T)? Y: par défaut (T))' qui est juste 'y' –

+0

Bon point. Cela devrait simplement être une fonction arbitraire plutôt que le mot-clé 'default'. – Noldorin

+0

Ah, il semble que je l'ai interprété correctement cette fois. :) – Noldorin

3

Cela dépend vraiment du type de x et y données, mais disent qu'ils sont des chaînes:

Where (data.x == (!string.IsNullOrEmpty(y) ? y : "default")) 

Il est appelé le conditional operator.

+1

Ceci est probablement proche de ce que le PO veut. Notez cependant qu'évaluer '! Foo' dans un conditionnel ('! String.IsNullOrEmpty (y) 'ici) est considéré comme une mauvaise pratique. Beaucoup plus simple simplement de changer l'ordre de vos valeurs de retour vrai/faux. :) – Noldorin

+0

@Noldorin: Je sais, je ne voulais pas échanger beaucoup de choses par rapport à l'extrait de la question; bon point à lever encore, merci pour cela. –

+0

Oui, c'est juste. Par souci de cohérence, il est probablement logique de le laisser de cette façon. (Cela correspond aussi plus à l'opérateur de coalescence nulle.) – Noldorin

3

Votre pourrait être interprété message original comme ceci:

where (data.x ?? y) == y 

Edit: Je suis assez sûr que ce soit ce que vous tentiez. :)

Édition 2: Ceci est le null-coalescing operator.

Édition 3: Celui qui a voté contre moi devrait afficher une raison. J'ai interprété le premier message comme suit: "Si x n'est pas vide, il doit être égal à y, mais il est correct d'être égal à default (typeof y)." Pour les types de référence ou types nullable, mon message est correct.

Édition 4: Mine encore pourrait être la réponse la plus propre à son poste mis à jour. Je continue à le lire et il est toujours étrangement libellé. Le poste (string.IsNullOrEmpty(y)) est l'autre possibilité.

+0

Certes, la question n'est pas très claire, mais je doute fortement que ce soit ce que veut le PO. Vous avez x et y à l'envers pour commencer. – Noldorin

+0

Vérifier mes modifications. Ce libellé a du sens dans le message original, et voici comment il pourrait être utilisé. "Si l'utilisateur a entré l'option * y *, faites quelque chose, et * y * est la valeur par défaut, donc s'ils n'ont rien saisi, c'est bien aussi." C'est juste un exemple. –

+0

Il n'y a aucune indication que cette valeur "par défaut" est "y". En fait, bien au contraire - je ne vois pas comment cela pourrait être. – Noldorin

Questions connexes