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 la variable KeyValuePair, la méthode FirstOrDefault ne renverra 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 structure. Le code suivant est invalide:
if (day == null) {
System.Diagnotics.Debug.Write("Couldn't find day of week");
}
Nous vous essayons 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?
FirstOrDefault
ne retourne pas null, il retourne default(T)
.
Vous devriez vérifier:
var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
De MSDN - Enumerable.FirstOrDefault<TSource>
:
default (TSource) si la source est vide; sinon, le premier élément de source.
Remarques:
EqualityComparer<T>.Default.Equals(day, defaultDay)
, car .Equals
peut être remplacé ou day
peut être une null
.var defaultDay = default;
, voir Littéral "default" typé à la cible .FirstOrDefault
C'est la manière la plus claire et concise à 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 évite complètement l'utilisation de bizarres valeurs par défaut pour les structures.
Vous pouvez le faire à la place:
var days = new Dictionary<int?, string>(); // 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");
}