0
votes

Quelle est la bonne façon d'écrire cette expression Lambda Linq et de gérer les NULLS?

Bien que cela fonctionne, je suis assez certain qu'il existe un moyen plus concis (et approprié?) d'écrire cette expression.

    double currentPopulation = 0.0;
    if (detailmetrics.FirstOrDefault(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 &&
                                           dm.Timeframe.Equals("C")) != null)
    {
         currentPopulation = Convert.ToDouble(
             detailmetrics.FirstOrDefault(dm => dm.MetricScopeID == 2 && dm.MetricTypeID == 1 &&
                                          dm.Timeframe.Equals("C")
             ).MetricValue
         );
    }


4 commentaires

Si le type de compilage de dm.timeframe est simplement string , je préfère dm.timeframe == "C" sur DM .TimeFrame.equals ("c") .


Merci ... Le type d'heure de compilation de DM.TimeFrame est en effet une chaîne. Par curiosité (et j'espère apprendre quelque chose), pourquoi préférez-vous '==' sur des plats?


Parce qu'il est plus facile de lire (opinion personnelle). C'est pour la même raison que je ne fais pas dm.metricscopeid.equals (2) même si je pouvais. Il y a d'autres raisons. Utilisation de == ne donnera pas d'exception de référence NULL si son opérande gauche est null . Et utiliser == se plaindre souvent de fausses comparaisons accidentelles. Par exemple, dm.metricscopeid.equals ("c") compilera (mais est inutile car il compare un numéro à une chaîne) tandis que dm.metricscopeid == "C" ne compilera pas (vous informer que l'opération n'est pas autorisée).


Vous voudrez peut-être aussi envisager d'utiliser double.trypsarse si la valeur de métricvalue pourrait causer convert.todouble pour lancer une exception et vous voulez gérer il.


4 Réponses :


2
votes

Attribuer le résultat de la requête à une variable temporaire pour éviter d'évaluer deux fois l'évaluation deux fois.

currentPopulation = Convert.ToDouble(dm?.MetricValue ?? "0");


0 commentaires

0
votes

Vous pouvez le raccourcir à: XXX

De cette façon, vous n'ayez évalué que la FirstArdefault une fois.


1 commentaires

Je pense que vous voulez dire convert.todouble (dm.metricValue)



0
votes

beaucoup de façons de cuire un chat, y compris (votre prédicat omis pour la brièveté): xxx

ce qui précède signifie que le métricvalue est une chaîne qui est null ou un double valide, et que vous voulez un résultat 0 s'il est null.

Si vous ne voulez pas faire cette hypothèse, vous pouvez écrire votre propre méthode de conversion "sûre" qui gère les nulls et invalide Valeurs, par exemple: xxx


0 commentaires

5
votes

Tout simplement xxx


3 commentaires

Upvoted. Définit Courrovectivepopulation à 0.0 si aucun élément satisfait le prédicat. Je sais que c'est exprès, mais il est différent du code d'origine qui n'attribuait pas à CoururalPopulation dans ce cas.


Merci @bahrom pour votre commentaire. J'ai édité le message original pour montrer que j'initialise la variable avant la condition.


@MBrianDunson Après cette modification, cette réponse est plus équivalente au code (édité) de la question et, en fait, Bahrom peut réintroduire le var ils avaient une fois depuis qu'il est approprié maintenant.