給出一個包含兩列這樣的數據表:你選擇了Forloops嗎?
Private Function CreateDataTable() As DataTable
Dim customerTable As New DataTable("Customers")
customerTable.Columns.Add(New DataColumn("Id", GetType(System.Int32)))
customerTable.Columns.Add(New DataColumn("Name", GetType(System.String)))
Dim row1 = customerTable.NewRow()
row1.Item("Id") = 1
row1.Item("Name") = "Customer 1"
customerTable.Rows.Add(row1)
Dim row2 = customerTable.NewRow()
row2.Item("Id") = 2
row2.Item("Name") = "Customer 2"
customerTable.Rows.Add(row2)
Dim row3 = customerTable.NewRow()
row3.Item("Id") = 3
row3.Item("Name") = "Customer 3"
customerTable.Rows.Add(row3)
Return customerTable
End Function
你會使用這個片段檢索列表(整數),包含所有的Id:
Dim table = CreateDataTable()
Dim list1 As New List(Of Integer)
For i As Integer = 0 To table.Rows.Count - 1
list1.Add(CType(table.Rows(i)("Id"), Integer))
Next
或者說這一個:
Dim list2 = (From r In table.AsEnumerable _
Select r.Field(Of Integer)("Id")).ToList()
這不是一個關於是否通過使用.Field(Of Integer),CType,CInt,DirectCast或其他類型將Id列轉換爲Integer的問題回答你是否選擇Linq作爲主題的暗示。
對於那些有興趣誰:我跑了一些重複這兩個版本這就造成了以下性能圖:
縱軸表示它採取了代碼轉換的毫秒行的id變成一個通用列表,橫軸顯示行數。藍線來自命令式(forloop),即來自聲明式代碼(linq)的紅線。
不管你的方法一般選擇:你爲什麼走那條路,而不是其他?
這是真的嗎?我記得前一段我讀過的博客文章。你可以在這裏找到它:http://ox.no/posts/linq-vs-loop-a-performance-test。基本結論是這樣的:「自然,這不會像傳統的命令循環那樣好,而且優化也不太可能」。這個結果來自運行時比較,導致linq查詢執行比命令式方法差50倍。 – Mephisztoe 2010-07-26 12:13:10
我發現性能的論點不是很好,我不認爲如果沒有任何代碼更改,LINQ查詢的性能將無法大幅提高,因爲系統必須向後兼容。但是,由於可讀性和可維護性,我傾向於使用聲明式編程方式。 LINQ查詢在表達意圖方面要好得多。 – Steven 2010-07-26 12:16:59
我第二個這個。我也認爲聲明性linq查詢更具可讀性,因此可以維護。然而,達林引入了代碼優化的論點,我想知道編譯器是否真的能夠比命令式代碼更好地基於聲明式語法優化代碼。 – Mephisztoe 2010-07-26 12:19:38