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
虽然这对于小列表来说工作得很好,但是当列表变大时,显然这是非常低效的。是否有一种我错过的结构或方法可以提高效率?
这是一个很好的观点。我想我可以缓存名称列表和总权重,所以当我回想起这个代码时,它会快得多。 – Lance 2014-10-07 16:11:53
为了更新,我最终移动到了一个名称列表和权重循环,并将它们缓存在字典中,现在速度几乎是瞬间的。再次感谢你。 – Lance 2014-10-08 12:35:21