2009-10-29 3 views
295

У меня есть объект типа IEnumerable<KeyValuePair<T,U>> keyValueList, я используюпо умолчанию для KeyValuePair

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

Как я могу проверить, является ли getResult по умолчанию, в случае, если я не могу найти правильный элемент?

Я не могу проверить, null или нет, потому что KeyValuePair - это структура.

+1

Вот аналогичный вопрос с некоторыми интересными ответами: http://stackoverflow.com/q/793897/323071 –

+2

Вы также можете сказать getResult.Key! = Null, чтобы проверить, является ли список нулевым, как если бы он был ключ всегда будет – pengibot

+3

@pengibot. Предполагается, что ключ является нулевым. –

ответ

417

Попробуйте это:

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

или это:

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

Здесь вы можете использовать концепцию «нового» варианта, но не нужно повторно указывать тип: if (getResult.Equals (Activator.CreateInstance (getResult.GetType()))) – kevinpo

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

Единственное, что не компилируется. Вместо этого следует использовать равные. –

78

Вы можете создать общий (и общий) метод расширения, как это:

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

     return isDefault; 
    } 
} 

Использование:

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

Попробуйте это:

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

Конечно, это только работает, если вы никогда не собираетесь (случайно или целенаправленно) добавлять null в качестве ключа. Но я бы сказал, что это правда в подавляющем большинстве случаев, поэтому хорошая идея. Это определенно простой способ проверки, чем большинство проверок здесь. – neminem

+1

Пока ключ является нулевым. –

6

Из исходного кода это выглядит как то, что вы хотите, чтобы проверить, если список был пуст:

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

Я рекомендую более понимание пути, используя метод расширения :

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

А затем просто использовать:

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

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

if(country.IsNull()){ 

}