2014-10-06 90 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