C LINQ中的Where方法的內部實現

2021-10-22 02:11:37 字數 1350 閱讀 5932

引子:

假設我們有乙個0-10的陣列,需要挑出所有的奇數,那麼我們就可以用where語句來過濾出滿足條件的數字

var items=

new;

var evennums=items.

where

(x=>x%2==

0);foreach

(var item in evennums)

上面的**可以讓我們實現這個需求

但是如果我們在where的下面一句**上打乙個斷點,此時我們發現evennums裡面其實並沒有把我們需要的奇數過濾出來,此時的變數evennums是空的,where的過濾這步操作其實是到foreach遍歷的時才執行的。

下面我們可以自己實現乙個where的功能來看一下效果

using system;

using system.collections.generic;

}return data;}}

}

用我自己實現的newwhere去替換linq本身的where以後,可以驚喜的發現,同樣的evennums,現在在執行完下面的一句**時,已經把需要過濾的條件的過濾出來了,說明linq本身的實現方式與我現在的實現是有區別的。從官方文件和比較權威的部落格那邊的解釋是說,linq的這種處理方式是一種延遲執行,也就是到了需要取資料時採取執行的

var evennums=items.

newwhere

(x=>x%2==

0);

那麼如何自己實現這種延遲執行的效果呢???

我們可以把實現newwhere的**再仔細看一下

using system;

using system.collections.generic;

}return data;}}

}

上面的**有乙個return語句,問題就出在這個return關鍵字上。

如果我們用下面的方式,配合ienumerable介面和yield關鍵字

using system;

using system.collections.generic;

}//return data;}}

}

此時,我們自己實現的newwhere語句也實現了延遲執行的特性

雖然我現在還不知道,微軟為什麼要設計成這種延遲執行的方式,但是我覺得他這樣設計肯定有他自己的理由,說不定就這樣子一點點的學習到某個階段,我就能理解他這麼設計的原因了吧。有朝一日我知道了,這麼設計的原因時,我會回來更新部落格。

課程學習位址

C linq中的all方法

確定是否對序列中的所有元素都滿足條件。返回乙個bool型別。一定要注意是所有的元素都要滿足才會返回true,只要有乙個元素不滿足就返回false 關於返回值為啥是bool,可以看一下關於func的解讀。宣告乙個int型別的陣列 int ints 判斷陣列的每乙個值是否都小於11 bool zc in...

C Linq中的Select方法的說明

enumerable.range 0,20 select i console.writeline i 計算完成 return x 當你嘗試執行上面的 會發現並沒有輸出,這是為什麼呢?意思就是它只是儲存了乙個操作,相當於儲存了乙個委託,只有在列舉時才執行委託。即 將結果tolist時就會產生輸出,因為...

C Linq 的使用整理 持續更新中

linq即language integrated query 語言整合查詢 linq是整合到c 和visual basic.net這些語言中用於提供查詢資料能力的乙個新特性。注 linq 發音為link 1 linq是.net框架的擴充套件,它允許我們以資料庫查詢的方式查詢資料集合。2 c 3.0包...