2013-01-09 51 views
2

如果我有一個說法,如:Linq FirstOrDefault每次迭代評估謂詞?

var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == bytereader.readInt()); 

此代碼是否從我流中讀取一個整數每次迭代,或是否曾經讀過的整數,儲存,然後用整個查找它的價值?

+2

爲什麼不自己檢查一下? – horgh

+2

我目前正在使用它的情況下,它不關心,如果它或不。我只是好奇! – jduncanator

+3

你仍然可以用自己的代碼來滿足你的好奇心 – horgh

回答

3

考慮以下代碼:

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

+0

因此它每次都從流中讀取一個新的整數? – jduncanator

+0

是的,它會在每次迭代時調用你的方法。 – JoshVarty

+0

是的。然而,考慮一下...你的代碼看起來像它會比較不同的ID與流中的不同整數....不是每個都有每個 – horgh

2

我不知道,不檢查,但希望它讀它每次。

但是,使用以下版本的代碼很容易解決這個問題。

byte val = bytereader.readInt(); 
var item = Core.Collections.Items.FirstOrDefault(itm => itm.UserID == val); 

我自己,我會自動採取這種方法,只是爲了消除任何疑問。可能是一個好習慣,因爲沒有理由爲每個項目閱讀它。

+0

我知道,我有點好奇,找不到文檔任何地方。 – jduncanator

1

實際上很明顯,電話是爲每個項目執行的 - FirstOrDefault()以委託爲參數。這個事實通過使用lambda方法有點模糊,但最終該方法只看到一個委託,它可以調用每個項目來檢查謂詞。爲了只評估右邊一次,一些魔法機制必須理解並重寫該方法,並且(有時令人遺憾),編譯器和運行時間內沒有真正的魔法。

+0

你的權利!應該是顯而易見的;) – jduncanator