我有一個List<KeyValuePair<string, othertype>>
。我需要做的沿列表<T>如何在T是struct的情況下工作?
list.Find(x=>x.Key=="foobar")
不過線的東西,如果沒有在列表中存在,將行爲是什麼呢?通常它會返回null,但結構不能爲空。
我有一個List<KeyValuePair<string, othertype>>
。我需要做的沿列表<T>如何在T是struct的情況下工作?
list.Find(x=>x.Key=="foobar")
不過線的東西,如果沒有在列表中存在,將行爲是什麼呢?通常它會返回null,但結構不能爲空。
它將返回default(T)
,這將與new KeyValuePair<string, othertype>>()
相同,即默認的初始化結構。
基本上,對於引用類型,默認值始終null
,而對於值類型(包括struct
)它是默認(0
爲數字,false
爲bool
,與每一個場一struct
默認爲結構等)
因此,對於default(KeyValuePair<string, othertype>>)
你會得到一個KVP其中Key
是null
(默認爲string
)和無論default(othertype)
會(如上面的例子)...
從MSDN:
匹配由指定 謂詞所定義的條件的第一個元素,若發現;否則,對於T類型
的默認值利用這一點,如果你想檢查,看看你回來了default
,我建議你檢查yourResult.Key != null
,看看你得到了一個結果,或者你可以正如Olivier所建議的,使用不同的Find
方法,如FindIndex
。
值得注意的是,對於特定值類型「可空
通過閱讀這兩個文檔的文章,這聽起來我好像你應該返回你的結構的默認值:
默認值: http://msdn.microsoft.com/en-us/library/aa664475(v=vs.71).aspx
列表(T).Find方法: http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx
我的建議是使用FindIndex
非可空類型
int index = list.FindIndex(x => x.Key == "foobar");
if (index >= 0) {
// found!
UseResult(list[index]);
}
如果Find()
不成功,則返回默認值default(T)
。對於不可爲空的類型,此結果不能與具有默認值的常規條目區分開來。當列表可能包含常規null
條目時,對於可空類型也是如此。
+1:這是更好的解決方案。在這種情況下,具有null鍵的鍵值對不太可能是合法的值,但這是可能的。很多人都忘記了這一點,或者,例如,一個'List
+1:非常好。我不想與默認值進行比較;就像你說的那樣,在大多數情況下,沒有辦法確定差異。 –
結構是一個值類型。所以,在結構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
}
嘿,如果情況看起來如此......錯了。這永遠不會適用於參考類型:)結構絕對不是我每天都在使用的東西,儘管 – Earlz
我將'=='更改爲Equals。 –
我建議不要做'==新的Test()',這有點沉重,因爲'struct'上的== ==是反射的。我建議在'OP'例子中檢查'null'的'Key'字段。 –
用'int'試一試,看看會發生什麼。 – Oded
類型T的默認值,更具體地說是'default(T)'。 –
如果您希望找不到匹配項時返回null,請考慮使用Tuple而不是KeyValuePair。 – JamieSee