2009-10-29 5 views
295

J'ai un objet du type IEnumerable<KeyValuePair<T,U>> keyValueList, j'utiliseLa valeur par défaut pour KeyValuePair

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 peux pas trouver l'élément correct?

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

+1

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

+2

Vous pouvez également dire getResult.Key! = Null pour vérifier si la liste est nulle comme si elle est toujours nulle – pengibot

+3

@pibibot Cela suppose que la clé est nullable. –

Répondre

417

Essayez ceci:

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

ou ceci:

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

Vous pouvez utiliser le concept de la "nouvelle" option ici, mais évitez d'avoir à re-spécifier le type: if (getResult.Equals (Activator.CreateInstance (getResult.GetType()))) – kevinpo

6
if(getResult.Key == default(T) && getResult.Value == default(U)) 
+0

La seule chose est qu'il ne compile pas. Equals devrait être utilisé à la place. –

78

Vous pouvez créer un général (et générique) méthode d'extension, comme celui-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' 
15

Essayez ceci:

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)); 
+1

Bien sûr, cela seulement fonctionne si vous n'allez jamais (accidentellement ou délibérément) ajouter null comme une clé. Mais je dirais que c'est vrai la grande majorité du temps, donc bonne idée. C'est certainement un moyen de vérification plus simple que la plupart des contrôles ici. – neminem

+1

Tant que la clé est nullable. –

6

À partir de votre code d'origine, il ressemble à ce que vous voulez est de vérifier si la liste était vide:

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

Je recommande de façon plus comprendre en utilisant la méthode d'extension :

public static class KeyValuePairExtensions 
{ 
    public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair) 
    { 
     return pair.Equals(new KeyValuePair<T, TU>()); 
    } 
} 

Et puis il suffit d'utiliser:

var countries = new Dictionary<string, string> 
{ 
    {"cz", "prague"}, 
    {"de", "berlin"} 
}; 

var country = countries.FirstOrDefault(x => x.Key == "en"); 

if(country.IsNull()){ 

} 
Questions connexes