454

我有一个类型的对象IEnumerable<KeyValuePair<T,U>> keyValueList,我正在使用

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

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

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

4

8 回答 8

623

尝试这个:

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

或这个:

if (getResult.Equals(default(KeyValuePair<T,U>)))
于 2009-10-29T03:06:41.377 回答
113

您可以创建一个通用(和通用)扩展方法,如下所示:

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'
于 2011-04-12T13:11:38.250 回答
30

尝试这个:

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));
于 2011-05-24T17:33:34.273 回答
10
if(getResult.Key.Equals(default(T)) && getResult.Value.Equals(default(U)))
于 2009-10-29T03:05:56.127 回答
9

我推荐使用扩展方法的更多理解方式:

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

}
于 2014-10-29T09:50:47.490 回答
8

从您的原始代码看来,您想要检查列表是否为空:

var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
   /* default */
}
else
{
}
于 2012-02-07T14:21:49.637 回答
2

对于您的应用程序,检查键或值是否为default.. 可能就足够了。例如,如果您有一个KeyValuePair<int,string>非零正整数到字符串的映射,并且字符串永远不会为空,那么:

if(getResult.Key == default)

if(getResult.Value == default)

将指示已返回默认 KVP

从本质上讲,如果只进行一次测试就可以了,可能不需要测试整个 KVP 是否为默认值;考虑一下您的用例

于 2021-10-19T19:16:51.213 回答
2

为了避免拳击,KeyValuePair.Equals(object)你可以使用ValueTuple.

if ((getResult.Key, getResult.Value) == default)
于 2020-03-22T13:03:14.980 回答