2012-08-31 37 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)(假設沒有散列衝突)中查找某個單元格。

相關問題