DataView的RowFilter與DataTable的Select與Linq

一般在找DataTable裡的資料,有些情況下是沒有Key可以用,可以用DataView的RowFilter或是DataTable的 Select,看起來這兩種用法差不多,只是在回傳上的不同,Select是將結果以DataRow[]回傳,而RowFilter並沒有回傳, DataView直接就是過濾後的結果.而這兩種在效能上還是有些差異,現在還有Linq可以用,這個新東西的效能會不會比前兩者強?

一般在找DataTable裡的資料,有些情況下是沒有Key可以用,可以用DataView的RowFilter或是DataTable的Select,看起來這兩種用法差不多,只是在回傳上的不同,Select是將結果以DataRow[]回傳,而RowFilter並沒有回傳, DataView直接就是過濾後的結果.而這兩種在效能上還是有些差異,現在還有Linq可以用,這個新東西的效能會不會比前兩者強?

最近因為一些效能上的問題,所以就算是0.0幾秒的差別,對我來說也是差很多,所以列了幾個做法可以符合我要的結果去做選擇.

先抓了230筆的測試資料放到DataTable裡去,一共有Type,No,Name 這3個欄位,一樣跑了一萬次的方式去計時.

RowFilter的做法:

tmpDataTable.DefaultView.RowFilter="Type='NB' and No='CU123456'";

Select的做法:

tmpDataTable.Select("Type='NB'  and No='CU123456'");

這裡面的條件都是一樣的,也只會有一筆符合.測試完的結果很有趣,Select的速度跟Filter差了近百倍.索性拿Linq一起來玩,看起來比Filter慢,但Filter有測到一個現象,如果條件比較長,效能也會有些微的影響,可能還比Linq慢,而Linq影響不大,而且Filter要小心傳入的條件,要做一些特別過濾,而Linq沒差.

這次遇到的狀況,最後我三個都沒用,因為Select太慢,RowFilter要過濾特別字,這些動作也是要吃效能,Linq不能用,所以自己想辨法用Dictionary<string,Dictionary<string,string>>的方式,把DataTable分別依這三個欄位將值放進去,效能跟RowFilter的測試數據差不多,但受條件長度影響的程度與Linq差不多.

條件較短的情況:

clip_image002

條件較長一點的情況(也沒長多少,就No的Length=50):

clip_image004

最後中選的就是Dictionary,雖然只有這麼0.0幾秒的差異,但就我這次遇到的狀況,整體處理速度快了近半個小時~