0

Given the following class and declartion, assuming I've popupated myValues with instances of CellValue, is there an easy way of returning from myValues a cellValue whose RowID=1 and ColumnID=3

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

Public myValues As List(Of CellValue)

Instead of looping through each element in myValues, is there a way to do something like:

dim x as 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のようなものを使用する場合でも、コンパイラジェネレータコードはループ構造をセットアップします。これは単なるO(n)操作です。これを改善する方法はいくつかあります。

1つ:値を並べ替える

配列を並べ替えた順序で保持する場合は、バイナリ検索を使用して目的の値を見つけることができます。これには、配列を並べ替える(そして並べ替えたままにする)必要があるという追加のコストがかかりますが、ルックアップには見返りがあります。

2:ハッシュを使用する

クラスはGetHashCodeCellValueオーバーライドして、個別のハッシュ(など)を返すことができます。次に、クラスを使用して各値を格納し、 O(1)で特定のセルを検索できます(ハッシュの衝突がない場合)。RowID ^ ColumnIDDictionary<CellValue, CellValue>

于 2012-08-31T17:48:42.217 に答える
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 に答える