sélection d’une propriété de FirstOrDefault au cas où FirstOrDefault renvoie null

Je veux faire la déclaration suivante:

var block = blocksById.FirstOrDefault(X => X.Value == tracResult.ID).Key 

Ma question est de savoir comment traiter plus correctement dans le cas où j’ai la valeur null FirstOrDefault. Je ne pense tout simplement pas que if déclarations sont la seule solution possible …

Divisez-le en Where et Select :

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => x.Key) .FirstOrDefault(); 

Ainsi, vous n’obtiendrez pas d’exception NullRefferenceException si FirstOrDefault renvoie la valeur null .

Alternative, vous pouvez lui donner une valeur par défaut comme ceci:

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => x.Key) .FirstOrDefault() ?? somedefaultvalue; 

Ou comme @Silvermind a déclaré pour les types non nullable à nullable ( int ):

 var block = blocksById.Where(x => x.Value == tracResult.ID) .Select(x => (int?) x.Key) .FirstOrDefault() ?? somedefaultvalue; 

Mise à jour: certaines personnes semblent douter que ce soit un cas d’utilisation valide et soutiennent que la vérification de la valeur null doit être effectuée ultérieurement dans le programme.

Bien que dans de nombreuses circonstances, c’est le cas, il n’est pas toujours nécessaire que cela soit vrai, sinon, cela pourrait être plus pratique de cette façon.

Quelques exemples:

 //one liner, null check delegated (not my favorite): return SomeCalculatedValue(collection.Where(condition).Select(selection).FirstOrDefault()); //or a mapping (shown with default value): var result = collection.Where(condition) .Select(c => { Foo = c.Foo, Bar = c.Bar }).FirstOrDefault()) ?? new { Foo = "New", Bar = "Empty"};