2012-07-24 7 views
1

J'essaye d'exécuter le code suivant et cela fonctionne très bien si myObject est! = Null mais jette une erreur "valeur ne peut pas être nulle" si myObject est null. Idéalement, si myObject est nulle alors je voudrais avoir juste le HashSet ont une valeur unique de 0.Hashset "valeur ne peut pas être nulle" erreur

var ids = new HashSet<int>(myObject.Select(p => p.ID)); 

J'ai essayé quelques choses différentes. Je ne suis pas sûr pourquoi je pensais que cela fonctionnerait.

var ids = new HashSet<int>(myObject.Select(p => p.ID).Where(p => p != null)); 

et ce qui semblait devoir fonctionner.

var ids = new HashSet<int>(myObject.Select(p => (p == null) ? 0 : p.ID)); 

Finalement, cela a fonctionné, mais il semble qu'il y ait une meilleure solution.

var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0}); 

Quelqu'un a une meilleure façon de le faire?

Répondre

0

Si myObject est nul, votre code se traduit

var ids = new HashSet<int>(null.Select(p => p.ID)); 

Vous ne pouvez pas utiliser la méthode Select d'extension hors de null.

Votre solution

var ids = new HashSet<int>(myObject!= null ? myObject.Select(p => p.ID) : new int[] {0}); 

est la forme la plus compacte je suis au courant pour répondre à vos besoins, mais vous pourriez certainement cacher cette complexité dans une méthode ou une méthode d'extension si vous le souhaitez.

+0

Pensez-vous que je sacrifier la lisibilité pour la compacité? Je le regarde et cela a du sens, mais quelqu'un d'autre va-t-il voir cette ligne de code et la trouver trop compliquée? – Jay

0

Maintenant, votre réponse peut être nettoyé un peu:

var ids = new HashSet<int>(myObject?.Select(p => p.ID) ?? new [] {0}); 
Questions connexes