優れた質問と便利な回答:
C#のジェネリックリストのFindAllにパラメーターを追加する
しかし、誰かがJonSkeetの支援を有効な.NET2.0 VBに変えるのを手伝うことができますか?
私は彼の答えをいくつかの通常のCSharpコンバーターで実行しましたが、結果はコンパイルされません。
優れた質問と便利な回答:
C#のジェネリックリストのFindAllにパラメーターを追加する
しかし、誰かがJonSkeetの支援を有効な.NET2.0 VBに変えるのを手伝うことができますか?
私は彼の答えをいくつかの通常のCSharpコンバーターで実行しましたが、結果はコンパイルされません。
必要なジェネリックリストから継承するラッパークラスを作成します。次に、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
より一般的な解決策は、一般的なヘルパー クラスを作成し、それらを参照値で初期化することです。
整数リストと二重リストが必要な場合は、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
このコードを使用してヘルパーを作成し、比較ロジックをカプセル化できます。
私はあなたがこれを行うことができると思います
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
上記の説明に基づいて、さらに掘り下げてみると、VB への直接的な翻訳はないようです。VBer は、少なくとも VS2005 では長い道のりを歩まなければなりません。
最後に、私が見つけた最も明確な解決策であるPaul Stovell の例を使用しました。これは私たちにとってうまく機能しています。