2014-01-28 39 views
19

什麼是默認值KeyValuePair<string, int>'KeyValuePair <string, int>`的默認值是什麼?

例如我運行一個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<string,int>' and '<null>'

PS:lstMappings是類型的

List<KeyValuePair<string, int>> 
+1

這是對LINQ查詢非常不好的用法。你不應該在那裏使用LINQ。如果你想以不區分大小寫的方式對待你的密鑰,你應該提供你自己的IEqualityComparer,這將做到這一點。然後,您可以簡單地使用Dictionary的ContainsKey方法來確定是否存在匹配項,如果存在,則通過該鍵獲取值。 – jmcilhinney

+0

[KeyValuePair的默認值](http://stackoverflow.com/q/1641392/3834)的副本 – Graviton

回答

26

任何類型T的默認值是default(T),所以100%的理論精度你會寫

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

由於KeyValuePairstruct(即值類型),您無法將其與null進行比較。無論如何,將====進行比較作爲默認方法是錯誤的,因爲如果在引用類型上使用它,它通常會檢查引用是否相等。

16

KeyValuePair<T, T>是一個結構。因此,它是一個值類型,不能是null,並且將使用成員的默認值進行初始化。

對於KeyValuePair<string, int>,這將是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並檢查在沒有結果值時引發的異常。

+0

使用您的默認比較示例,我得到'Operator'!='不能應用於' System.Collections.Generic.KeyValuePair '和'System.Collections.Generic.KeyValuePair ''。否則,很好的答案。 – xr280xr

+0

@ xr280xr呵呵,我沒有意識到這一點。非常感謝! – poke

4

KeyValuePair<TKey, TValue>是一個結構,因此一個值類型,不能是null。使用它的成員的默認值填充結構的缺省值。在本例中是:

新KeyValuePair(NULL,0)


這應該回答你直接的問題,而是一個更優雅的方式做對比,你正在試圖做的是使用default關鍵字。

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

KeyValuePair<TKey, TValue>之外,您可以使用其他類型的等效代碼。對於參考類型default將返回null,否則將返回值類型的默認值。

+1

字符串的默認值爲空,而不是空字符串。 – poke

相關問題