11
votes

Lambda "si" déclaration?

J'ai 2 objets, dont tous les deux, je veux convertir en dictionnaires. J'utilise TODICTIONY <> ().

L'expression Lambda pour un objet pour obtenir la clé est (i => i.name). Pour l'autre, c'est (i => i.inner.name). Dans le second, je n'existe pas. i.inner.name existe toujours si je ne le fais pas.

Y a-t-il une expression lambda que je peux utiliser pour combiner ces deux? Fondamentalement à lire comme:

"Si i.Name existe alors définissez ID sur i.Name, sinon Set ID sur i.inner.name".

Merci beaucoup.

mise à jour

Quand je dis "n'exister pas", je veux dire que les objets n'ont pas réellement les propriétés, et non que les propriétés ne sont que null.


4 commentaires

Si vous dites que les propriétés n'existent pas, voulez-vous dire que les objets n'ont réellement pas les propriétés, ni que les propriétés ne sont que null?


Les objets n'ont pas réellement les propriétés.


Alors, ces deux types sont deux types complètement non liés alors?


@ shf301 oui. Cependant, tous ont une propriété de nom ou un objet.Name propriété de type chaîne.


5 Réponses :


6
votes

Oui, l'opérateur conditionnel ("Opérateur ternaire") fait ce que vous voulez:

(i => i.name != null ? i.name : i.inner.name)


1 commentaires

Ce que je voulais dire, c'est que je n'existe pas du tout. Le nom de la propriété n'est pas là. Je ne peux pas utiliser null. Toutes mes excuses si je faisais cela peu clair.



0
votes

Quelque chose le long des lignes de xxx

(non testé) devrait faire l'astuce si j'étais nul (une chaîne vide) ou xxx

(aussi non testé)


0 commentaires

14
votes

Si ce sont deux types distincts (référence), vous pouvez les tester à l'aide de est ou comme Mots-clés: xxx

Si vous ne pouvez pas tester pour des types spécifiques, vous pouvez utiliser la réflexion pour tester la propriété nom xxx


4 commentaires

Vous n'avez pas besoin de lancer i à tysethaThasnameProperty avant d'accéder à la propriété nom ?


@DTB: Probablement, je suppose que cela dépend de ce que ressemble au reste du code de l'OP. (Mais cela ne ferait aucun mal à faire de la mouche de toute façon, bien que dans mon exemple de code, je pense qu'utiliser comme est probablement plus approprié qu'un casting simple.)


Excellent travail sur cette réponse


C'est une réponse plus appropriée



4
votes

Pourquoi ne donnez-vous pas à chaque objet un TODICTION méthode de leur propre, car ils ont évidemment leurs propres comportements dans ce cas.

Si vous ne pouvez pas ajouter aux objets, car vous ne les possédez pas, vous pouvez toujours écrire des méthodes d'extension.

Toute raison que vous essayez de forcer à les nourrir dans une fonction "commune"?


2 commentaires

Peut-être que le remplacement de Tostring () serait le meilleur choix de comportement pour ces objets. Bien sûr, cela dépend de la question de savoir si vous comptez sur un autre comportement à Tostring () ailleurs ...


@Sekhat je venais de voir si je pouvais la combiner dans une seule fonction car je dois le faire plusieurs fois. Pour l'amour de la propreté.



-1
votes

comme une inline si requête, je voudrais utiliser un opérateur ternaire, donc: xxx


0 commentaires