2009-10-29 36 views
295

默认我有型IEnumerable<KeyValuePair<T,U>> keyValueList的对象,我使用键值对

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

如何检查getResult是否是默认的,如果我不能找到正确的元素?

我无法检查它是否为null或不是,因为KeyValuePair是一个结构。

+1

下面是一些有趣的答案类似的问题:http://stackoverflow.com/q/793897/323071 – 2012-01-26 14:14:33

+2

你也可以说getResult.Key!= null来检查列表是否为null,就好像它的关键字一直是null – pengibot 2012-08-10 11:06:02

+3

@pengibot假设关键字是可以为空的。 – 2013-11-10 23:55:21

回答

417

试试这个:

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

或本:

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

您可以在这里使用“新”选项的概念,但是不必重新指定类型: if(getResult.Equals(Activator.CreateInstance(getResult.GetType()))) – kevinpo 2014-03-21 14:42:47

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

唯一的是不编译。应该使用等值。 – 2016-03-11 15:32:24

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 2013-12-06 23:52:30

+1

只要密钥可以为空。 – 2014-11-19 08:41:29

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()){ 

}