voici mon code
string displayName = Dictionary.FirstOrDefault(x =>x.Value.ID== long.Parse(options.ID)).Value.DisplayName;
Le code fonctionne correctement si x.Value.ID correspond à options.ID. Cependant, j'obtiens une exception nullreference si ce n'est pas le cas.
FirstOrDefault
renvoie la valeur par défaut d'un type si aucun élément ne correspond au prédicat. Pour les types de référence, il s'agit de null
. C'est la raison de l'exception.
Il vous suffit donc de vérifier d'abord null
:
string displayName = null;
var keyValue = Dictionary
.FirstOrDefault(x => x.Value.ID == long.Parse(options.ID));
if(keyValue != null)
{
displayName = keyValue.Value.DisplayName;
}
Mais quelle est la clé du dictionnaire si vous recherchez dans les valeurs? UNE Dictionary<tKey,TValue>
est utilisé pour trouver une valeur par la clé. Peut-être devriez-vous le refactoriser.
Une autre option consiste à fournir une valeur par défaut avec DefaultIfEmpty
:
string displayName = Dictionary
.Where(kv => kv.Value.ID == long.Parse(options.ID))
.Select(kv => kv.Value.DisplayName) // not a problem even if no item matches
.DefaultIfEmpty("--Option unknown--") // or no argument -> null
.First(); // cannot cause an exception
Vous pouvez utiliser une combinaison d'autres méthodes LINQ pour gérer la condition ne correspondant pas:
var res = dictionary.Where(x => x.Value.ID == someID)
.Select(x => x.Value.DisplayName)
.DefaultIfEmpty("Unknown")
.First();
C’est parce que FirstOrDefault
peut retourner null
, ce qui entraîne votre .Value
pour provoquer l'exception. Vous devez le changer pour quelque chose comme:
var myThing = things.FirstOrDefault(t => t.Id == idToFind);
if(myThing == null)
return; // we failed to find what we wanted
var displayName = myThing.DisplayName;
je suppose que vous travaillez avec des types de données nullables, vous pouvez faire quelque chose comme ceci:
var t = things.Where(x => x!=null && x.Value.ID == long.Parse(options.ID)).FirstOrDefault();
var res = t == null ? "" : t.Value;
Pour ajouter aux solutions, voici une déclaration LINQ qui pourrait vous aider
Utilities.DIMENSION_MemTbl.Where(a => a.DIMENSION_ID == format.ContentBrief.DimensionID).Select(a=>a.DIMENSION1).DefaultIfEmpty("").FirstOrDefault();
Le résultat sera une chaîne vide si le résultat de la requête est null.