2

優れた質問と便利な回答:

C#のジェネリックリストのFindAllにパラメーターを追加する

しかし、誰かがJonSkeetの支援を有効な.NET2.0 VBに変えるのを手伝うことができますか?

私は彼の答えをいくつかの通常のCSharpコンバーターで実行しましたが、結果はコンパイルされません。

4

4 に答える 4

2

必要なジェネリックリストから継承するラッパークラスを作成します。次に、FindAllメソッドをオーバーロードします。

追加された演算子Enumを編集 して、もう少し柔軟性を持たせます。そこから拡張できるはずです。

    Module Module1

    Sub Main()
        Dim source As New IntList
        source.Add(1)
        source.Add(2)
        source.Add(3)
        source.Add(4)

        Dim newList As List(Of Integer) = source.FindAll(IntList.Operators.GreaterThan, 2)

        For Each i As Integer In newList
            Console.WriteLine(i.ToString)
        Next

        Console.WriteLine("Press any key..............")
        Console.ReadLine()
    End Sub

End Module

Public Class IntList
    Inherits Generic.List(Of Integer)

    Enum Operators
        Equal
        NotEqual
        GreaterThan
        GreaterThanEqualTo
        LessThan
        LessThanEqualTo
    End Enum

    Private _Val As Integer = Nothing
    Private _Op As Operators = Nothing

    Public Overloads Function FindAll(ByVal [Operator] As Operators, ByVal Val As Integer) As List(Of Integer)
        _Op = [Operator]
        _Val = Val
        Return MyBase.FindAll(AddressOf MyFunc)
    End Function

    Function MyFunc(ByVal item As Integer) As Boolean
        Select Case _Op
            Case Operators.Equal
                Return item = _Val
            Case Operators.NotEqual
                Return item <> _Val
            Case Operators.GreaterThan
                Return item > _Val
            Case Operators.GreaterThanEqualTo
                Return item >= _Val
            Case Operators.LessThan
                Return item < _Val
            Case Operators.LessThanEqualTo
                Return item <= _Val
        End Select
    End Function
End Class
于 2009-11-17T12:51:39.677 に答える
1

より一般的な解決策は、一般的なヘルパー クラスを作成し、それらを参照値で初期化することです。

整数リストと二重リストが必要な場合は、2 つのクラスを実装する必要がありますが、このアプローチでは 1 つしか使用しません。

Module Question1747687
    Class OperatorHelper(Of refType)
        Public ReferenceValue As refType

        Sub New(ByVal value As refType)
            ReferenceValue = value
        End Sub

        Public Function Equal(ByVal comp As refType) As Boolean
            Return ReferenceValue.Equals(comp)
        End Function

        Public Function NotEqual(ByVal comp As refType) As Boolean
            Return Not ReferenceValue.Equals(comp)
        End Function

        Public Function GreaterThan(ByVal comp As refType) As Boolean
            Return Compare(comp, ReferenceValue) > 0
        End Function

        Public Function GreaterThanEqualTo(ByVal comp As refType) As Boolean
            Return Compare(comp, ReferenceValue) >= 0
        End Function

        Public Function LessThan(ByVal comp As refType) As Boolean
            Return Compare(comp, ReferenceValue) < 0
        End Function

        Public Function LessThanEqualTo(ByVal comp As refType) As Boolean
            Return Compare(comp, ReferenceValue) <= 0
        End Function

        Private Function Compare(ByVal l As refType, ByVal r As refType) As Integer
            Return CType(l, IComparable).CompareTo(CType(r, IComparable))
        End Function
    End Class

    Sub Main()
        Dim source As New List(Of Integer)
        Dim helper As OperatorHelper(Of Integer)

        source.Add(1)
        source.Add(2)
        source.Add(3)
        source.Add(4)

        helper = New OperatorHelper(Of Integer)(2)
        Dim newlist As List(Of Integer) = source.FindAll(AddressOf helper.LessThanEqualTo)

        For Each i As Integer In newlist
            Console.WriteLine(i.ToString)
        Next

        Console.ReadLine()
    End Sub
End Module

このコードを使用してヘルパーを作成し、比較ロジックをカプセル化できます。

于 2009-11-17T17:10:55.333 に答える
0

私はあなたがこれを行うことができると思います

objectList.FindAll(AddressOf MyFunc)

Function MyFunc (ByVal item As testObject)
   Return item._groupLevel = desiredGroupLevel
End Function

これは頭​​から離れているので、正しいかどうかはわかりません。ただし、AddressOfを使用して別のルーチンを呼び出し、リスト内の各アイテムに対してアクションを実行できるという考え方です。

編集:コード例:

Module Module1

    Sub Main()
        Dim source As New List(Of Integer)
        source.Add(1)
        source.Add(2)
        source.Add(3)
        source.Add(4)

        Dim newList As List(Of Integer) = source.FindAll(AddressOf MyFunc)

    End Sub

    Function MyFunc(ByVal item As Integer) As Boolean
        Return item > 3
    End Function

End Module
于 2009-11-17T09:51:17.423 に答える
0

上記の説明に基づいて、さらに掘り下げてみると、VB への直接的な翻訳はないようです。VBer は、少なくとも VS2005 では長い道のりを歩まなければなりません。

最後に、私が見つけた最も明確な解決策であるPaul Stovell の例を使用しました。これは私たちにとってうまく機能しています。

于 2009-11-20T14:59:23.027 に答える