投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/12/28 01:11:49
>>パラメータ(仮にT型として)
> 私の理解では As Dictionary(Of String, Func(Of T, String))でうまく実現する方法が思いつきません。
たとえば T が「バージョン番号 As Integer」だとして、
YUU さん提示の dic, dic2, dic3 をまとめる場合の例。

Public dic0 As New Dictionary(Of String, Func(Of IntegerString))() From {
      {"ナノメートル"Function(version) "nm"},
      {"センチメートル"Function(version) "㎝"},
      {"マイクロメートル"Function(version) If(version = 3, "?""μm")},
      {"ミリメートル"Function(version) If(version = 1, "mm"Nothing)}
    }


ナノメートルとセンチメートルは、dic, dic2, dic3 で共通なので、T の値に関わらず変換
マイクロメートルは、dic3 のみ「別の何か」なので If 演算子等で分岐
ミリメートルは、dic のみの変換なので、T が 2 や 3 のときはNothing を返却
――というイメージです。



まぁ、実際の実装の是非は、要件次第で変わってくるとは思いますが、
バージョンごとの差が大きいなら、テーブルをver毎に持たせるのもよいでしょうし、
ごく一部だけの差異ならば、共有テーブルとバージョン別テーブルを持たせるのもよいでしょう。

たとえば:
Imports Map = System.Collections.Generic.Dictionary(Of StringString)
Module Module1
    '共通変換テーブル 
    Private dicStandard As New Map() From {
        {"ナノメートル""nm"},
        {"センチメートル""㎝"},
        {"マイクロメートル""μm"},
        {"ミリメートル""mm"}
    }

    'バージョン別差分 
    Private dicDiff As New Dictionary(Of Integer, Map) From {
        {1, New Map() From {}},
        {2, New Map() From {{"ミリメートル", Nothing}}},
        {3, New Map() From {
                {"ミリメートル", Nothing},
                {"マイクロメートル""?"}
            }
        }
    }

    Public Function Convert(version As Integer, source As StringAs String
        Dim result As String = Nothing
        If dicDiff(version).ContainsKey(source) Then
            'バージョン別差分を優先的に返す 
            Return dicDiff(version)(source)
        Else
            'バージョン別差分に情報が無ければ共通テーブルを使う 
            dicStandard.TryGetValue(source, result)
        End If
        Return result
    End Function
End Module