tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル複数引数を持つデリゲート述語
記事No7376
投稿日: 2008/04/21(Mon) 17:44
投稿者ダンボ
言葉がまだ生半可だと思います(タイトルも)。それもご指摘下さい。

Genericリストの便利そうなメソッド
.Exists
.Find
.FindAll
.FindIndex
.FindLast
.FindListIndex
.RemoveAll
.TrueForAll
を使うためには、「述語」を作らなければならない。

例題としてProfileClassのリストであるContentsに対してMatchという判定用メソッドを
EQCond にデリゲートして「述語」とする。

Public Class ProfileClass
    Public DFP As String
End Class
Private Contents As New System.Collections.Generic.List(Of ProfileClass)

Dim EQCond As Predicate(Of ProfileClass) = New Predicate(Of ProfileClass)(AddressOf Match)
Private Function Match(ByVal P As ProfileClass) As Boolean
    Return P.DFP = "AAA"
End Function
Dim FoundProfile As ProfileClass = Contents.Find(EQCond)

ここまでは理解しました。ここでもっと実用にするためにMatch判定メソッドでは "AAA"という
固定値でなく、任意のStringを引数として与えたいのですが、この方法が分かりません。

[ツリー表示へ]
タイトルRe: 複数引数を持つデリゲート述語
記事No7378
投稿日: 2008/04/21(Mon) 19:06
投稿者魔界の仮面弁士
> Genericリストの便利そうなメソッド
こういう時には、ラムダ式の出番ですね。

strValue = "AAA"
FoundProfile = Contents.Find(Function(p) p.DFP = strValue)


> 任意のStringを引数として与えたいのですが
VB でも、匿名メソッドが使えれば楽なのですけれどね。

ラムダ式を使わずに実装するなら、
>  Return P.DFP = "AAA"
の部分を、
 Return P.DFP = Me.HogeValue
のように、外からプロパティ等で渡されるようにするか、あるいは
 Dim hogeValue As String = String.Empty
 RaiseEvent ValueCallBack(hogeValue)
 Return P.DEP = hogeValue
のように、内部からコールバックすることで対応してみては如何でしょう。



Dim FoundProfile As ProfileClass = Contents.Find(ProfileClass.EQCond("AAA"))

Public Class ProfileClass
  Public DFP As String

  Public Shared Function EQCond(ByVal value As String) As Predicate(Of ProfileClass)
    Return AddressOf New Condition(value).Equal
  End Function

  Private Class Condition
    Private s As String
    Friend Sub New(ByVal s As String)
      Me.s = s
    End Sub
    Public Function Equal(ByVal P As ProfileClass) As Boolean
      Return P.DFP = s
    End Function
  End Class
End Class

[ツリー表示へ]
タイトルRe^2: 複数引数を持つデリゲート述語
記事No7383
投稿日: 2008/04/22(Tue) 10:04
投稿者ダンボ
魔界の仮面弁士さん、いつもありがとうございます。
言葉の理解は合っていたでしょうかね?

全部で5つの実装方法をご提示いただいたと理解しました。

(1)ラムダ式を用いる (VB2005では不可)
(2)匿名メソッドを用いる (VB.netでは不可)
(3)「第2引数」はプロパティ(or共用変数)で指示する
(4)RaiseEvent ValueCallBackで取り込む
(5)「述語」EQCondを動的に(評価時に)作り直す

「ValueCallBack」という単語はgoogleでは1例(しかも情報量小)しか
見つからないんですが何者でしょうか?

[ツリー表示へ]
タイトルRe^3: 複数引数を持つデリゲート述語
記事No7389
投稿日: 2008/04/22(Tue) 18:01
投稿者魔界の仮面弁士
> 言葉の理解は合っていたでしょうかね?
さぁ? あまり気にした事の無い分野だったので。
他の人のフォローに期待。((((;^^)

> 「ValueCallBack」という単語はgoogleでは1例(しかも情報量小)しか
> 見つからないんですが何者でしょうか?
イベント名です。別に ValueCallBack で無くとも、
Hoge でも OtaryMan でも COmega でも動きます。

今回使用する Dim value As String な値を、外部に問い合わせるために
使用するイベントとして、任意の名前を付けてください。デリゲートでも良いけど。

[ツリー表示へ]
タイトル[断念] 複数引数を持つデリゲート述語
記事No7395
投稿日: 2008/04/24(Thu) 06:33
投稿者ダンボ
> イベント名です。別に ValueCallBack で無くとも、
> Hoge でも OtaryMan でも COmega でも動きます。
> 使用するイベントとして、任意の名前を付けてください。デリゲートでも良いけど。

了解しました。OtaryManはおたくなサラリーマンなんでしょうかね?

VB2005で「第2引数」を指定するのにあまりスマートな方法は無いみたいですね。
MSDNのサンプルなどのように「第2引数」なしの場合だけ使うようにします。

思いつきですが、
System.Collections.Generic.List
を継承して第2引数ありの.FindなどをOverloadsするってのはどうでしょうね?
→自分でやってみてから必要なら再質問します。

[ツリー表示へ]
タイトルRe: [断念] 複数引数を持つデリゲート述語
記事No7396
投稿日: 2008/04/24(Thu) 10:11
投稿者魔界の仮面弁士
> VB2005で「第2引数」を指定するのにあまりスマートな方法は無いみたいですね。

でしょうね。結局、Predicate(Of T) を処理する一連のクラスを作る事になるでしょう。

そもそも、ラムダ式を使って書かれた
  foo = Contents.Find(Function(p) p.DFP = "AAA")
というコードも、実際には、下記のようなイメージにコンパイルされているようです。

  Dim tmp As New TemporaryClosure()
  tmp.value = "AAA"
  foo = Contents.Find(AddressOf tmp.Lambda)
 '----
 Class TemporaryClosure
  Public value As String
  Public Function Lambda(p As ProfileClass) As Boolean
   Return p.DFP = Me.value
  End Function
 End Class

> OtaryManはおたくなサラリーマンなんでしょうかね?
# 65万部突破だそうで。(謎

[ツリー表示へ]