【问题标题】:What is default value of `KeyValuePair<string, int>`? [duplicate]`KeyValuePair<string, int>` 的默认值是多少? [复制]
【发布时间】:2014-01-28 11:23:00
【问题描述】:

KeyValuePair&lt;string, int&gt; 的默认值是多少?

例如我正在运行 LINQ 查询并从中返回 FirstOrDefault()

KeyValuePair<string, int> mapping = (from p in lstMappings
    where p.Key.Equals(dc.ColumnName, StringComparison.InvariantCultureIgnoreCase)
    select p).FirstOrDefault();

if (mapping != null)
{ 

}

如何检查mapping 对象是否为空/空白
(我在上面的代码中遇到编译时错误Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair&lt;string,int&gt;' and '&lt;null&gt;'

PS:lstMappings 属于类型

List<KeyValuePair<string, int>>

【问题讨论】:

  • LINQ 查询的使用非常糟糕。你根本不应该在那里使用 LINQ。如果您希望能够以不区分大小写的方式处理您的密钥,您应该提供自己的 IEqualityComparer 来做到这一点。然后,您只需使用 Dictionary 的 ContainsKey 方法来确定是否存在匹配项,如果存在,则通过该键获取值。

标签: c# linq


【解决方案1】:

任何类型 T 的默认值都是 default(T),因此为了 100% 的理论准确度,您可以编写

if (!mapping.Equals(default(KeyValuePair<string, int>))) {
    // ...
}

由于KeyValuePairstruct(即值类型),因此您无法将其与null 进行比较。无论如何,将值与== 进行比较作为默认方法是错误的,因为如果用于引用类型,它通常会检查引用是否相等。

【讨论】:

  • "将值与== 进行比较作为默认方法是错误的,因为如果用于引用类型,它通常会检查引用是否相等" ???我认为这是相当标准的做法?
【解决方案2】:

KeyValuePair&lt;T, T&gt; 是一个结构。因此,它是一个值类型,不能是null,并且会使用成员的默认值进行初始化。

对于KeyValuePair&lt;string, int&gt;,这将是null 字符串和int 值0

KeyValuePair<string, int> kvp = default(KeyValuePair<string, int>);
Console.WriteLine(kvp.Key == null); // True
Console.WriteLine(kvp.Value == 0); // True

就像我用default(T)用它的默认值初始化对象一样,你也可以用它来比较你的结果,看看它是否是默认值:

if (!mapping.Equals(default(KeyValuePair<string, int>)))
{ … }

如果您不想使用默认值,另一种选择是只使用 First 并检查在没有结果值时抛出的异常。

【讨论】:

  • 使用您与默认值进行比较的示例,我得到Operator '!=' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair&lt;string,object&gt;' and 'System.Collections.Generic.KeyValuePair&lt;string,object&gt;'。否则,很好的答案。
  • @xr280xr 嗯,我没有意识到这一点。非常感谢!
【解决方案3】:

KeyValuePair&lt;TKey, TValue&gt; 是一个结构,因此是一个值类型,不能是null。结构的默认值是用其成员的默认值填充的结构。在此示例中,它将是:

新的 KeyValuePair(null, 0)


这应该回答您的直接问题,但您尝试做的比较更优雅的方法是使用 default 关键字。

if (mapping != default(KeyValuePair<string, int>))
{ 
    // Mapping has default value
}

您可以对除KeyValuePair&lt;TKey, TValue&gt; 之外的任何其他类型使用等效代码。对于引用类型default将返回null,否则返回值类型的默认值。

【讨论】:

  • 字符串的默认值为null,不是空字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2011-05-08
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多