96 votes

Comment puis-je m'assurer que FirstOrDefault <KeyValuePair> a renvoyé une valeur

Voici une version simplifiée de ce que je suis en train 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));

Depuis 'xyz' n'est pas présent dans la KeyValuePair variable, le FirstOrDefault méthode ne retourne pas une valeur valide. Je veux être en mesure de vérifier cette situation, mais je me rends compte que je ne peux pas comparer le résultat à la valeur "null" parce que KeyValuePair est une struc. Le code suivant est valide:

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

Nous vous tentez de compiler le code, Visual Studio lance le message d'erreur suivant:

Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'

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

164voto

Kobi Points 65357

FirstOrDefault ne renvoie pas la valeur null, il renvoie la valeur par défaut (T).
Vous devriez vérifier pour:

 var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);
 

Voir aussi: http://msdn.microsoft.com/en-us/library/bb340482.aspx

56voto

peaceoutside Points 146

C'est la manière la plus claire et la plus 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X