web-dev-qa-db-fra.com

FirstOrDefault renvoie une exception NullReferenceException si aucune correspondance n'est trouvée.

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.

32
Raz Mahato

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
64
Tim Schmelter

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();
11
Konrad Kokosa

C’est parce que FirstOrDefaultpeut 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;
2
Zache

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;
0
A.T.

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.

0
pat capozzi