如何有效查询大清单

时间:2019-02-25 18:42:01

标签: vb.net winforms

搜索大型自定义列表的最佳方法是什么?例如,我有以下列表...

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属性,哪种更好,更快的方式可以搜索列表?

1 个答案:

答案 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快。