我有一个结构:
Private Structure udtT9Map
Dim KeyboardKey As String
Dim MobileButton As Integer
End Structure
它们存储在
中Private _List As List(Of udtT9Map)
我想知道是否有一种非常快速的方法可以通过提供某个KeyboardKey在List中找到一个项目。
因为e。 G。 “KeyboardKey”理论上可以多次出现,我猜MS不包含这样的函数,因为列表中的多个项目将被返回。
我错了吗?
非常感谢!
答案 0 :(得分:2)
列表没有任何快速查找项目的方法。定位列表中的项目将是O(n)操作,即您需要遍历整个列表并比较每个结构的值。对于快速查找,您宁愿使用列表字典:
Private _Dict as Dictionary(Of String, List(Of udtT9Map))
通过使用KeyboardKey
值作为键,将具有相同KeyboardKey
值的所有结构存储在字典的列表中,您可以非常快速地获得具有该值的所有结构。从字典中读取接近于O(1)操作。
要获取您使用的列表:
Dim result as List(Of udtT9Map) = _Dict(key)
如果您的KeyboardKey
值在集合中是唯一的,那么您不需要列表字典,您可以使用结构字典:
Private _Dict as Dictionary(Of String, udtT9Map)
获取您使用的项目:
Dim result as udtT9Map = _Dict(key)
答案 1 :(得分:1)
有几种可能的方法:
创建一个查找字典以获取 O(1)查找:
Dim _dict = _List.GroupBy(Function(x) x.KeyboardKey)
.ToDictionary(Function(x) x.Key, Function(x) x.ToList())
对列表进行排序,并使用BinarySearch
获取 O(log n)搜索复杂度。您必须声明自己的Comparer(Of T)
以按属性值进行搜索,或者编写自己的BinarySearchBy
方法。
使用标准Find
方法获取 O(n)复杂性。它将返回匹配给定条件的第一个元素。