web-dev-qa-db-fra.com

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?

73
desautelsj

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:

131
Kobi

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.

50
peaceoutside

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");
}
0
Jocelyn Marcotte