给定以下类和声明,假设我已经使用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)
答案 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)中查找某个单元格(前提是没有哈希冲突)。