如果我有一個說法,如:Linq FirstOrDefault每次迭代評估謂詞?
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt());
此代碼是否從我流中讀取一個整數每次迭代,或是否曾經讀過的整數,儲存,然後用整個查找它的價值?
如果我有一個說法,如:Linq FirstOrDefault每次迭代評估謂詞?
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt());
此代碼是否從我流中讀取一個整數每次迭代,或是否曾經讀過的整數,儲存,然後用整個查找它的價值?
考慮以下代碼:
static void Main(string[] args)
{
new[] { 1, 2, 3, 4 }.FirstOrDefault(j => j == Get());
Console.ReadLine();
}
static int i = 5;
static int Get()
{
Console.WriteLine("GET:" + i);
return i--;
}
它表明,它將調用該方法,它需要滿足匹配條件的第一個元素的次數。輸出將是:
GET:5
GET:4
GET:3
因此它每次都從流中讀取一個新的整數? – jduncanator
是的,它會在每次迭代時調用你的方法。 – JoshVarty
是的。然而,考慮一下...你的代碼看起來像它會比較不同的ID與流中的不同整數....不是每個都有每個 – horgh
我不知道,不檢查,但希望它讀它每次。
但是,使用以下版本的代碼很容易解決這個問題。
byte val = bytereader.readInt();
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == val);
我自己,我會自動採取這種方法,只是爲了消除任何疑問。可能是一個好習慣,因爲沒有理由爲每個項目閱讀它。
我知道,我有點好奇,找不到文檔任何地方。 – jduncanator
實際上很明顯,電話是爲每個項目執行的 - FirstOrDefault()
以委託爲參數。這個事實通過使用lambda方法有點模糊,但最終該方法只看到一個委託,它可以調用每個項目來檢查謂詞。爲了只評估右邊一次,一些魔法機制必須理解並重寫該方法,並且(有時令人遺憾),編譯器和運行時間內沒有真正的魔法。
你的權利!應該是顯而易見的;) – jduncanator
爲什麼不自己檢查一下? – horgh
我目前正在使用它的情況下,它不關心,如果它或不。我只是好奇! – jduncanator
你仍然可以用自己的代碼來滿足你的好奇心 – horgh