簡體   English   中英

從excel表中計算單個人的元素 - vb .net

[英]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。 如果是類庫或不同類型的項目,請使用線程或常規異步函數。 以下是一些參考:

BackgroundWorker 示例

使用 Vb.NET 進行異步編程

您擁有的最后一個foreach循環,您可以使用 Linq 來簡化它。 它可能不會提高性能,但會使代碼看起來更簡潔、更簡短。 這是一個參考:

LINQ 與 Vb.NET

希望這能幫到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM