在列表中查找结构项(结构)

时间:2014-03-23 23:25:18

标签: vb.net list

我有一个结构:

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不包含这样的函数,因为列表中的多个项目将被返回。

我错了吗?

非常感谢!

2 个答案:

答案 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)

有几种可能的方法:

  1. 创建一个查找字典以获取 O(1)查找:

    Dim _dict = _List.GroupBy(Function(x) x.KeyboardKey)
                     .ToDictionary(Function(x) x.Key, Function(x) x.ToList())
    
  2. 对列表进行排序,并使用BinarySearch获取 O(log n)搜索复杂度。您必须声明自己的Comparer(Of T)以按属性值进行搜索,或者编写自己的BinarySearchBy方法。

  3. 使用标准Find方法获取 O(n)复杂性。它将返回匹配给定条件的第一个元素。