Voici une version simplifiée de ce que j'essaie de faire:
var days = new Dictionary<int, string>();
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 le dictionnaire, la méthode FirstOrDefault ne retournera pas de valeur valide. Je veux pouvoir vérifier cette situation mais je me rends compte que je ne peux pas comparer le résultat à "null" car KeyValuePair est une struc. Le code suivant n'est pas valide:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Nous vous essayez de compiler le code, Visual Studio lève l'erreur suivante:
Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'
Comment puis-je vérifier que FirstOrDefault a renvoyé une valeur valide?
Réponses:
FirstOrDefault
ne retourne pas null, il retournedefault(T)
.Vous devriez vérifier:
Depuis MSDN -
Enumerable.FirstOrDefault<TSource>
:Remarques:
EqualityComparer<T>.Default.Equals(day, defaultDay)
, car.Equals
il se peut qu'il soit remplacé ouday
qu'il s'agisse d'un fichiernull
.KeyValuePair<int, string> defaultDay = default;
, voir Littéral "par défaut" typé par cible .FirstOrDefault
la source
typeof
t- il ? Ce code se compile et fonctionne.default(KeyValuePair<T1, T2>)
qui en résulterait. Ok, cela aurait dû être assez évident, que cela aboutirait à un KVP vide. Mais comme "être évident" n'est pas une bonne approche pour écrire des applications appropriées (et mon implémentation actuelle est trop complexe pour provoquer clairement / proprement ce cas), je l'ai essayé avec un nouveau projet et - en effet - il a renvoyé unKeyValuePair
avec des propriétésKey
etValue
étant les deuxNULL
.... juste pour protéger d'autres personnes ces 5 minutes de bêtise ;-)default
mot - clé, il manque clairement ici. Merci!KeyValuePair
. Si vous aviez un code générique, ilday.Equals
n'est même pas sûr de null, et j'aurais utiliséEqualityComparer<T>.Default.Equals(day, defaultDay)
C'est le moyen le plus clair et le plus concis à mon avis:
Cela évite complètement d'utiliser des trucs étranges de valeur par défaut pour les structures.
la source
days
c'est un fichierDictionary<int,string>
. Il sera donc considéré comme unIEnumerable<KeyValuePair<int,string>>
, se comportant alors comme prévu quandAny()
etFirst()
sera appelé. Je suppose qu'il existe d'autres implémentations qui peuvent se comporter différemment commeIEnumerable<>
. Je ne sais pas si je manque quelque chose.Vous pouvez le faire à la place:
puis :
la source