Comment puis-je m’assurer que FirstOrDefault a renvoyé une valeur

Voici une version simplifiée de ce que j’essaie de faire:

var days = new Dictionary(); days.Add(1, "Monday"); days.Add(2, "Tuesday"); ... days.Add(7, "Sunday"); var sampleText = "My favorite day of the week is 'xyz'"; var day = days.FirstOrDefault(x => sampleText.Contains(x.Value)); 

Puisque ‘xyz’ n’est pas présent dans la variable KeyValuePair, la méthode FirstOrDefault ne renverra pas de valeur valide. Je veux être capable de vérifier cette situation mais je me rends compte que je ne peux pas comparer le résultat à “null” car KeyValuePair est une structure. Le code suivant n’est pas valide:

 if (day == null) { System.Diagnotics.Debug.Write("Couldn't find day of week"); } 

Nous essayons de comstackr le code, Visual Studio génère l’erreur suivante:

 Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair' and '' 

Comment puis-je vérifier que FirstOrDefault a renvoyé une valeur valide?

C’est le moyen le plus clair et le plus concis à mon avis:

 var matchedDays = days.Where(x => sampleText.Contains(x.Value)); if (!matchedDays.Any()) { // Nothing matched } else { // Get the first match var day = matchedDays.First(); } 

Cela permet de contourner complètement les trucs de valeur par défaut pour les structures.

FirstOrDefault ne retourne pas null, il renvoie la default(T) .
Vous devriez vérifier pour:

 var defaultDay = default(KeyValuePair); bool b = day.Equals(defaultDay); 

De MSDN – Enumerable.FirstOrDefault :

default ( TSource ) si la source est vide; sinon, le premier élément dans la source .

Remarques:

  • Si votre code est générique, il est préférable d’utiliser EqualityComparer.Default.Equals(day, defaultDay) , .Equals peut être .Equals ou day peut être null .
  • En C # 7.1, vous pourrez utiliser var defaultDay = default; , voir Littéral “par défaut” typé par cible .
  • Voir aussi: Source de référence – FirstOrDefault

Vous pouvez le faire à la place:

 var days = new Dictionary(); // replace int by int? days.Add(1, "Monday"); days.Add(2, "Tuesday"); ... days.Add(7, "Sunday"); var sampleText = "My favorite day of the week is 'xyz'"; var day = days.FirstOrDefault(x => sampleText.Contains(x.Value)); 

et alors :

 if (day.Key == null) { System.Diagnotics.Debug.Write("Couldn't find day of week"); }