0

给定以下类和声明,假设我已经使用 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 中的每个元素,而是有一种方法可以执行以下操作:

暗淡 x 作为 CellValue = myValues.???(RowID=1, ColumnID=3)

4

3 回答 3

4

好吧,有些东西必须循环,但您可以使用 LINQFirst方法或List(Of T).Find指定谓词。

例如:

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

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

于 2012-08-31T17:45:34.657 回答
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

祝你好运!

于 2012-08-31T17:48:37.090 回答
1

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

一:对你的价值观进行排序

如果你让你的数组按排序顺序排列,你可以使用二分搜索来找到你想要的值。这增加了必须对数组进行排序(并保持排序)的成本,但它可以为查找带来回报。

二:使用哈希

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

于 2012-08-31T17:48:42.217 回答