Vb.net 按聚合属性快速查找(T的)列表中的项
我有一个如下所示的对象列表:Vb.net 按聚合属性快速查找(T的)列表中的项,vb.net,list,search,Vb.net,List,Search,我有一个如下所示的对象列表: 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(ByVa
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
虽然这对小列表很有效,但当列表变大时,显然效率非常低。有没有我缺少的结构或方法可以提高效率?我认为您的函数很好,但您是否认为您的代码经过了3次循环。。首先取出字符,然后求和,然后捕获项目的子集。也许,若您通过删除初始Linq来重做代码,您可以创建一个常规循环,在该循环中,您可以修复Name属性并计算权重。这将使你的时间减少33%这是一个很好的观点。我想我可能可以缓存名称列表和总权重,因此当我回忆起这段代码时,速度会快得多。只是为了更新,我最终移动到名称列表和权重的单个循环,并将它们缓存在字典中,现在速度几乎是瞬间的。再次感谢你。