2014-10-06 67 views
0

於第(T)名單上有對象的列表,看起來像這樣的項目:快速找到由總財產

Public Class LineItem 
    Public Property Name As String 
    Public Property Weight As Int32 
    Public Property Expression As String 
End Class 

Private _lineItems As New List(Of LineItem) 

我隨機選擇一個項目像這樣:

Public Function SelectItem(ByVal name As String) As LineItem 
    Dim items As List(Of LineItem) = CType(Rules.Where(Function(li As LineItem) li.Name = name.Remove("[", "]")).ToList, List(Of LineItem)) 
    Dim totalWeight As Int32 = items.Sum(Function(li As LineItem) li.Weight) 

    If totalWeight > 0 Then 
     Dim sum As Int32 = 0 
     Dim index As Int32 = (BaseGrammar.Random.Next Mod totalWeight) + 1 
     For Each item As LineItem In items 
      sum += CInt(item.Weight) 
      If sum >= index Then 
       Return item 
      End If 
     Next 
    End If 
    Return Nothing 
End Function 

雖然這對於小列表來說工作得很好,但是當列表變大時,顯然這是非常低效的。是否有一種我錯過的結構或方法可以提高效率?

回答

1

我覺得你的功能很好,但是你認爲你的代碼是否經過了循環3次..首先取出字符,然後找到總和,然後捕獲項目的子集。也許如果你通過刪除最初的Linq來重做你的代碼,你可以做一個固定的循環,你可以在其中修復Name屬性並總結Weight。這會減少你的時間33%

+0

這是一個很好的觀點。我想我可以緩存名稱列表和總權重,所以當我回想起這個代碼時,它會快得多。 – Lance 2014-10-07 16:11:53

+0

爲了更新,我最終移動到了一個名稱列表和權重循環,並將它們緩存在字典中,現在速度幾乎是瞬間的。再次感謝你。 – Lance 2014-10-08 12:35:21