2009-10-29 18 views
295

mam obiektu typu IEnumerable<KeyValuePair<T,U>> keyValueList używamDomyślną KeyValuePair

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

Jak mogę sprawdzić, czy getResult jest domyślny, w przypadku nie mogę znaleźć właściwego elementu?

Nie mogę sprawdzić, czy jest to null czy nie, ponieważ KeyValuePair jest strukturą.

+1

Oto podobne pytanie z ciekawych odpowiedzi: http://stackoverflow.com/q/793897/323071 –

+2

Możesz również powiedzieć getResult.Key! = Null, aby sprawdzić, czy lista ma wartość null, tak jakby klucz zawsze był pusty. – pengibot

+3

@pengibot Zakładając, że klucz jest zerowy. –

Odpowiedz

417

Spróbuj tego:

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

lub to:

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

Możesz użyć pojęcia "nowej" opcji, ale unikaj ponownej specyfikacji typu: jeśli (getResult.Equals (Activator.CreateInstance (getResult.GetType()))) – kevinpo

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

Jedyne, co jest, to nie kompiluje. Zamiast tego należy użyć równań. –

78

Można stworzyć ogólne (i generycznych) metodę rozszerzenia, jak to jedno:

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

     return isDefault; 
    } 
} 

Wykorzystanie:

// 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

Spróbuj tego:

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

Oczywiście, że tylko działa, jeśli nigdy nie zamierzasz (przypadkowo lub celowo) dodać null jako klucza. Ale powiedziałbym, że to prawda w zdecydowanej większości przypadków, więc dobry pomysł. Jest to zdecydowanie łatwiejszy sposób niż większość kontroli tutaj. – neminem

+1

Tak długo, jak klucz jest zerowy. –

6

ze swojego oryginalnego kodu wygląda na to, co chcesz, aby sprawdzić, czy lista była pusta:

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

Polecam bardziej wyrozumiały sposób przy użyciu metody rozszerzenie :

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

A następnie po prostu użyj:

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

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

if(country.IsNull()){ 

}