在没有循环的情况下搜索dotnet中的列表集合

时间:2012-08-31 17:41:22

标签: .net

给定以下类和声明,假设我已经使用CellValue实例弹出myValues,是否有一种从myValues返回RowID = 1和ColumnID = 3的cellValue的简单方法

Class CellValue
    Public RowID, ColumnID As Integer
    Public Value As Object
End Class

Public myValues As List(Of CellValue)

不是循环遍历myValues中的每个元素,有没有办法做类似的事情:

dim x as CellValue = myValues.???(RowID = 1,ColumnID = 3)

3 个答案:

答案 0 :(得分:4)

某些必须循环,但您可以使用LINQ First方法或List(Of T).Find,指定谓词。

例如:

Dim x = myValues.Find(Function(cell) cell.RowID = 1 AndAlso cell.ColumnId = 3)

请注意,如果找不到这样的单元格,您应该考虑要发生什么。在这种情况下,Find将返回T的默认值(大概是Nothing),而FirstOrDefault的行为方式相同; First会抛出异常。

答案 1 :(得分:1)

你可以用LinQ完成这个:

    Module Module1
        Public myValues As List(Of CellValue)
        Sub Main()
            myValues = New List(Of CellValue)

            myValues.Add(New CellValue With {.RowID = 1, .ColumnID = 1, .Value = "Hello 1"})
            myValues.Add(New CellValue With {.RowID = 2, .ColumnID = 2, .Value = "Hello 2"})
            myValues.Add(New CellValue With {.RowID = 3, .ColumnID = 3, .Value = "Hello 3"})
            myValues.Add(New CellValue With {.RowID = 4, .ColumnID = 4, .Value = "Hello 4"})
            myValues.Add(New CellValue With {.RowID = 5, .ColumnID = 5, .Value = "Hello 5"})

            Dim x As CellValue = (From val As CellValue In myValues Where val.RowID = 1 Select val).FirstOrDefault()

        End Sub

    End Module
    Class CellValue
        Public RowID, ColumnID As Integer
        Public Value As Object
    End Class
祝你好运!

答案 2 :(得分:1)

只要你有一个没有特定顺序的对象数组,任何解决方案都将涉及循环查找所需的值。即使你使用像LINQ这样的东西,编译器生成器代码仍然会设置一个循环结构。这只是一个 O(n)操作。有几种方法可以改进:

一:对您的值进行排序

如果按顺序排列数组,可以使用binary search找到所需的值。这需要对数组进行排序(并保持其排序)的成本增加,但它可以为查找付出代价。

二:使用哈希

您的CellValue类可以覆盖GetHashCode并返回不同的哈希值(例如RowID ^ ColumnID)。然后,您可以使用Dictionary<CellValue, CellValue>类来存储每个值,并在 O(1)中查找某个单元格(前提是没有哈希冲突)。