搜索大型自定义列表的最佳方法是什么?例如,我有以下列表...
Dim BigList As New List(Of Button)
For i As Integer = 0 To 99999
Dim Btn As New Button With {.Text = "Button Number: " & i}
BigList.Add(Btn)
Next
现在可以在我的BigList中找到特定的按钮了,我应该...
Dim BtnX As Button
BtnX = BigList.Find(Function(p) p.Text = "Button Number: 25784")
由于我的按钮列表包含99,999个按钮(可能更多),这将如何影响性能?如果我什至在搜索之前就完全知道按钮的.Text属性,哪种更好,更快的方式可以搜索列表?
答案 0 :(得分:1)
首先,使用99999个按钮列表是个坏主意-您在整个应用程序会话中只能使用有限的控件。
每个控件都是GDI Object
,如果将其传递给您,则应用程序的体系结构会出现问题,并且会引发异常。
而不是使用controls
,请使用{{3 }},以便节省资源。
来自MSDN(System.Drawing.Graphics class ):
每个会话最多只能有65,536个GDI句柄。 但是,每个可以打开的GDI句柄的最大数量 会话通常较低,因为它受可用内存的影响。
第二,对于您的问题,您可以使用FirstOrDefault()
LINQ扩展方法:
Dim btn As Button = BigList.FirstOrDefault(Function(p) p.Text = "Button Number: 25784")
另外,如果您将使用HashSet<T>
或Array
,则与List<T>
相比,您会获得更好的性能
另一种方法是使用SortedDictionary-SortedDictionary (Of Int16, Button)
然后使用GDI Objects通过字典中的int16键找到按钮,二进制搜索比LINQ快。