2008年2月1日金曜日

.NET ForEachだけではない繰り返しメソッド

こんな使い方ができるとは知りませんでした。


@IT KeyValuePair(Of Integer, String)のコレクションよりValueに一致する最初のKeyを取得したい

ForEachだけではない繰り返しメソッド

長いジェネリック・クラスの名前を短く記述するには?[2.0のみ、C#、VB]


Imports IntStrItem = _

      System.Collections.Generic.KeyValuePair(Of IntegerString)


 

Imports IntStrList = _

  System.Collections.Generic.List(Of _

    System.Collections.Generic.KeyValuePair(Of IntegerString))


 


 

Module Module1


 

    Sub Main()

        Dim List As New System.Collections.Generic.List(Of System.Collections.Generic.KeyValuePair(Of IntegerString))

        List.Add(New System.Collections.Generic.KeyValuePair(Of IntegerString)(1"りんご"))

        List.Add(New System.Collections.Generic.KeyValuePair(Of IntegerString)(2"みかん"))

        List.Add(New System.Collections.Generic.KeyValuePair(Of IntegerString)(3"すいか"))

        List.Add(New System.Collections.Generic.KeyValuePair(Of IntegerString)(4"みかん"))


 

        '方法その1

        Dim orange As System.Collections.Generic.KeyValuePair(Of IntegerString) = _

        List.Find(AddressOf IsOrange)

        Console.WriteLine("Key:{0} Value{1}", Orange.Key, Orange.Value)


 

        '方法その2_1(コンストラクタでフィルタ値を指定)

        Dim filter As IntStrItemFilter(Of IntegerString) = New IntStrItemFilter(Of IntegerString)("りんご")

        Dim apple As IntStrItem = List.Find(AddressOf filter.IsMatch)

        Console.WriteLine("Key:{0} Value{1}", apple.Key, apple.Value)


 

        '方法その2_2(プロパティでフィルタ値を指定)

        filter.FilterValue = "すいか"

        Dim watermelon As IntStrItem = List.Find(AddressOf filter.IsMatch)

        Console.WriteLine("Key:{0} Value{1}", watermelon.Key, watermelon.Value)


 

    End Sub


 

    Private Function IsOrange(ByVal item As System.Collections.Generic.KeyValuePair(Of IntegerString)) As Boolean

        Return (item.Value = "みかん")

    End Function


 


 

    Public Class IntStrItemFilter(Of TKey, TValue)


 

        Private _FilterValue As TValue


 

        Public Sub New(ByVal filterValue As TValue)

            _FilterValue = filterValue

        End Sub


 

        Public Property FilterValue() As TValue

            Get

                Return _FilterValue

            End Get

            Set(ByVal value As TValue)

                _FilterValue = value

            End Set

        End Property


 

        Public Function IsMatch(ByVal item As IntStrItem) As Boolean

            If (_FilterValue Is NothingThen Return False

            Return (_FilterValue.Equals(item.Value))

        End Function


 

    End Class


 

End Module

0 件のコメント: