2012-10-01 46 views
12

我有一個List<KeyValuePair<string, othertype>>。我需要做的沿列表<T>如何在T是struct的情況下工作?

list.Find(x=>x.Key=="foobar") 

不過線的東西,如果沒有在列表中存在,將行爲是什麼呢?通常它會返回null,但結構不能爲空。

+2

用'int'試一試,看看會發生什麼。 – Oded

+2

類型T的默認值,更具體地說是'default(T)'。 –

+0

如果您希望找不到匹配項時返回null,請考慮使用Tuple而不是KeyValuePair。 – JamieSee

回答

13

它將返回default(T),這將與new KeyValuePair<string, othertype>>()相同,即默認的初始化結構。

基本上,對於引用類型,默認值始終null,而對於值類型(包括struct)它是默認(0爲數字,falsebool,與每一個場一struct默認爲結構等)

因此,對於default(KeyValuePair<string, othertype>>)你會得到一個KVP其中Keynull(默認爲string)和無論default(othertype)會(如上面的例子)...

MSDN

匹配由指定 謂詞所定義的條件的第一個元素,若發現;否則,對於T類型

的默認值利用這一點,如果你想檢查,看看你回來了default,我建議你檢查yourResult.Key != null,看看你得到了一個結果,或者你可以正如Olivier所建議的,使用不同的Find方法,如FindIndex

+0

值得注意的是,對於特定值類型「可空」,由於缺省初始化導致HasValue爲false(如同任何結構的布爾字段),它會使結構在許多上下文中被解釋爲空值。 – supercat

14

我的建議是使用FindIndex非可空類型

int index = list.FindIndex(x => x.Key == "foobar"); 
if (index >= 0) { 
    // found! 
    UseResult(list[index]); 
} 

如果Find()不成功,則返回默認值default(T)。對於不可爲空的類型,此結果不能與具有默認值的常規條目區分開來。當列表可能包含常規null條目時,對於可空類型也是如此。

+1

+1:這是更好的解決方案。在這種情況下,具有null鍵的鍵值對不太可能是合法的值,但這是可能的。很多人都忘記了這一點,或者,例如,一個'List '可以包含空值。 – phoog

+1

+1:非常好。我不想與默認值進行比較;就像你說的那樣,在大多數情況下,沒有辦法確定差異。 –

3

結構是一個值類型。所以,在結構Find的情況下將返回結構的默認值。

例:

比方說,我們有如下的結構,

public struct Test 
{ 
    public int i; 
} 

List<Test> list = new List<test>() { new Test { i = 1 } }; 
Test result = list.Find(o => o.i == 2); 

類似的新的測試上面查找結果值()。您可以通過以下代碼比較價值。

if (resul.Equals(new Test())) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 

OR

if (resul.Equals(default(Test))) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 
+0

嘿,如果情況看起來如此......錯了。這永遠不會適用於參考類型:)結構絕對不是我每天都在使用的東西,儘管 – Earlz

+0

我將'=='更改爲Equals。 –

+0

我建議不要做'==新的Test()',這有點沉重,因爲'struct'上的== ==是反射的。我建議在'OP'例子中檢查'null'的'Key'字段。 –

相關問題