[英]counting elements for single person from excel sheet - vb .net
我得到了任務並解決了它,但我想知道是否可以改進代碼。 我得到了很多列的 excel,但其中只有 2 列對我很重要。 一列代表人名,第二列代表經紀人姓名。 有幾個不同的經紀人可用,每個人都被分配到多個經紀人。 目標是獨立計算單個人的每個經紀人的數量。 Excel 看起來或多或少像這樣: Name1 Broker1 Name2 Broker2 Name3 Broker1 Name2 Broker1 Name2 Broker3 Name1 Broker3 Name3 Broker3
等等。 我的代碼工作正常,並給了我想要的結果。 然而,我在編寫代碼時追求“完美”,所以如果這可以縮短或改進,請將其留給您的評估。 謝謝:) osoby - 人名 brokerzy - 經紀人名字
Dim osoby As New List(Of String)
Dim brokerzy As New List(Of String)
For Each row As DataRow In dt.Rows
osoby.Add(row(1).ToString)
brokerzy.Add(row(2).ToString)
Next
Dim osobyStr As String() = osoby.ToArray
Dim brokerzyStr As String() = brokerzy.ToArray
For Each osoba As String In osobyStr.Distinct()
Dim brokerzy2 As New List(Of String)
For i As Integer = 0 To osobyStr.Length - 1
If osobyStr(i).ToString = osoba Then
brokerzy2.Add(brokerzyStr(i).ToString)
End If
Next
Dim brokerzyStrArr As String() = brokerzy2.ToArray
Dim tes As String
brokerzyStrArr.Distinct().ToList().ForEach(Sub(b) console.WriteLine("{0}:{1}:{2}",osoba,b,brokerzyStrArr.Count(Function(jeden) jeden=b)))
console.readline()
Next
當然,代碼可以在一定程度上得到改進。 但是,它可能對性能的影響很小。
先說第一件事。 讓我們縮小幾行。 從:
Dim osoby As New List(Of String)
Dim brokerzy As New List(Of String)
到:
Dim osoby, brokerzy As New List(Of String)
您要做的下一件事是循環遍歷DataTable
每個DataRow
。 相反,您可以使用DataReader
。 不同之處在於,當涉及到DataTable
,您需要首先從給定數據庫讀取整個數據(所有行)並將其存儲在DataTable
,而在DataReader
的情況下,您可以訪問每一行而無需等待所有行/記錄。 這是一個示例:
Dim reader as OleDbDataReader = oledbCommand.ExecuteReader()
While reader.Read()
Dim data = reader.GetString(1)
End While
在優先考慮性能的情況下,使用DataReader
是理想的選擇。 您可以做的另一件事是在后台異步運行這些數據庫操作。 如果您有一個WinForms項目,您可以使用BackgroundWorker
類並在后台運行該操作,這樣它就不會影響您的 UI。 如果是類庫或不同類型的項目,請使用線程或常規異步函數。 以下是一些參考:
您擁有的最后一個foreach
循環,您可以使用 Linq 來簡化它。 它可能不會提高性能,但會使代碼看起來更簡潔、更簡短。 這是一個參考:
希望這能幫到你!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.