2012-08-31 34 views
0

给定以下类并声明,假设我已经使用CellValue的实例推广myValues,是否有一种从myValues返回RowID = 1和ColumnID = 3的cellValue的简单方法:在没有循环的情况下在dotnet中搜索列表集合

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

那么东西已经循环,但您可以使用LINQ First方法或List(Of T).Find,指定一个谓词。

例如:

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

请注意,您应该考虑要发生,如果没有这样的细胞可以发现什么。 Find将在此情况下返回默认值T(推测为Nothing),并且FirstOrDefault的行为方式相同; First会抛出异常。

+0

nvm ..这是谓词方法 – WhiskerBiscuit

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 

祝你好运!

1

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

一:排序你的价值观

如果你让你数组排序顺序,您可以使用binary search找到您所需的值。这会增加必须对数组进行排序(并保持排序)的成本,但它可以为查找做好准备。

二:使用哈希

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

相关问题