Comment puis-je m'assurer que FirstOrDefault <KeyValuePair> a renvoyé une valeur
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:
- Si votre code est générique, il est préférable d'utiliser
EqualityComparer<T>.Default.Equals(day, defaultDay)
, car.Equals
peut être remplacé ouday
peut être unenull
. - En C # 7.1, vous pourrez utiliser
var defaultDay = default;
, voir Littéral "default" typé à la cible . - Voir aussi: Source de référence -
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");
}