485 votes

La valeur par défaut pour KeyValuePair

J'ai un objet de type IEnumerable<KeyValuePair<T,U>> keyValueList J'utilise

 var getResult= keyValueList.SingleOrDefault();
 if(getResult==/*default */)
 {
 }
 else
 {
 } 

Comment puis-je vérifier si getResult est la valeur par défaut, au cas où je ne trouverais pas l'élément correct ?

Je ne peux pas vérifier si c'est null ou non, car KeyValuePair est une structure.

1 votes

Voici une question similaire avec quelques réponses intéressantes : stackoverflow.com/q/793897/323071

3 votes

Vous pouvez également dire getResult.Key != null pour vérifier si la liste est nulle, car si elle l'est, la clé sera toujours nulle.

3 votes

@pengibot Cela suppose que la clé est nullable.

665voto

Andrew Hare Points 159332

Essayez ça :

if (getResult.Equals(new KeyValuePair<T,U>()))

ou ceci :

if (getResult.Equals(default(KeyValuePair<T,U>)))

5 votes

Vous pouvez utiliser le concept de l'option "nouveau" ici, mais éviter de devoir re-spécifier le type : if (getResult.Equals(Activator.CreateInstance(getResult.GetType())))

21 votes

Je pense if (getResult.Equals(default)) fonctionne également

10 votes

@Simon non, ce n'est pas le cas. default est égal à null. Et default(KeyValuePair<T,U>) est une paire clé/valeur réelle qui contient null, null . J'en ai fait l'expérience moi-même.

118voto

pholpar Points 456

Vous pouvez créer une méthode d'extension générale (et générique), comme celle-ci :

public static class Extensions
{
    public static bool IsDefault<T>(this T value) where T : struct
    {
        bool isDefault = value.Equals(default(T));

        return isDefault;
    }
}

Utilisation :

// We have to set explicit default value '0' to avoid build error:
// Use of unassigned local variable 'intValue'
int intValue = 0;
long longValue = 12;
KeyValuePair<String, int> kvp1 = new KeyValuePair<String, int>("string", 11);
KeyValuePair<String, int> kvp2 = new KeyValuePair<String, int>();
List<KeyValuePair<String, int>> kvps = new List<KeyValuePair<String, int>> { kvp1, kvp2 };
KeyValuePair<String, int> kvp3 = kvps.FirstOrDefault(kvp => kvp.Value == 11);
KeyValuePair<String, int> kvp4 = kvps.FirstOrDefault(kvp => kvp.Value == 15);

Console.WriteLine(intValue.IsDefault()); // results 'True'
Console.WriteLine(longValue.IsDefault()); // results 'False'
Console.WriteLine(kvp1.IsDefault()); // results 'False'
Console.WriteLine(kvp2.IsDefault()); // results 'True'
Console.WriteLine(kvp3.IsDefault()); // results 'False'
Console.WriteLine(kvp4.IsDefault()); // results 'True'

32voto

Peter Points 91

Essayez ça :

KeyValuePair<string,int> current = this.recent.SingleOrDefault(r => r.Key.Equals(dialog.FileName) == true);

if (current.Key == null)
    this.recent.Add(new KeyValuePair<string,int>(dialog.FileName,0));

5 votes

Bien sûr, cela ne fonctionne que si vous n'allez jamais (accidentellement ou volontairement) ajouter null comme clé. Mais je dirais que c'est vrai la grande majorité du temps, donc bonne idée. C'est un contrôle beaucoup plus simple que la plupart des contrôles effectués ici.

4 votes

Tant que la clé est nullable.

10voto

ChaosPandion Points 37025
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))

0 votes

La seule chose est qu'il ne compile pas. Il faut utiliser Equals à la place.

9voto

D'après votre code original, il semble que ce que vous voulez, c'est vérifier si la liste est vide :

var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
   /* default */
}
else
{
}

0 votes

Vous pouvez simplement omettre la première ligne, car elle n'est pas utilisée.

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