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%

这是一个很好的观点。我想我可能可以缓存名称列表和总权重,因此当我回忆起这段代码时,速度会快得多。只是为了更新,我最终移动到名称列表和权重的单个循环,并将它们缓存在字典中,现在速度几乎是瞬间的。再次感谢你。