2

私はこの列挙を持っています:

Enum Lame_Bitrate
    kbps_8 = 8
    kbps_16 = 16
    kbps_24 = 24
    kbps_32 = 32
    kbps_40 = 40
    kbps_48 = 48
    kbps_56 = 56
    kbps_64 = 64
    kbps_80 = 80
    kbps_96 = 96
    kbps_112 = 112
    kbps_128 = 128
    kbps_144 = 144
    kbps_160 = 160
    kbps_192 = 192
    kbps_224 = 224
    kbps_256 = 256
    kbps_320 = 320
End Enum

そして、数値を指定して Enum の近似値を返したいと思います。

たとえば、数値がある190場合は、Enum でより近似した値を見つけて192(Enum の kbps_192 値) を返すことを期待します。数値がある場合は196、値を返すことを期待します192(次の値を返さない)。224はあまり近似されていないためです)。

このようなもの:

Private Sub Test()

    Dim wma_file As String = "C:\windows media audio file.wma"
    Dim wma_file_Bitrate As Integer = 172
    Dim mp3_bitrate_approximated As Integer

    mp3_bitrate_approximated = Return_Approximated_Value_Of_Enum(wma_file_Bitrate)

End Sub

private function Return_Approximated_Value_Of_Enum(byval value as integer) as integer

    return... enum.find(value).approximated...

end function

列挙型の他の数値を指定して、より近似した数値を見つけるためのフレームワーク メソッドはありますか?

私の質問を理解していただければ幸いです、ありがとう。

PS: 可能であれば、LINQ 拡張機能を使用したソリューションを好みます。

4

2 に答える 2

4

最も近い列挙型を見つけたい場合:

Dim number = 190
Dim allBitrates() As Lame_Bitrate = DirectCast([Enum].GetValues(GetType(Lame_Bitrate)), Lame_Bitrate())
Dim nearestBitrate = allBitrates.OrderBy(Function(br) Math.Abs(number - br)).First()

最も近いすべての列挙型を検索する場合 (同じ最小距離を持つ複数の場合):

number = 120 ' two with the same distance
Dim nearestBitrates As IEnumerable(Of Lame_Bitrate) = allBitrates.
    GroupBy(Function(br) Math.Abs(number - br)).
    OrderBy(Function(grp) grp.Key).
    First()
Console.Write(String.Join(",", nearestBitrates))

出力:

kbps_112,kbps_128
于 2013-10-31T21:50:33.933 に答える
0

@Tim Schmelter ソリューションを採用し、3 つの一般的な機能を実行しました。

これを共有したいだけです。

· 最も近い列挙値を取得:

' Enum Bitrate As Short : kbps_128 = 128 : kbps_192 = 192 : kbps_256 = 256 : kbps_320 = 320 : End Enum
' MsgBox(Get_Nearest_Enum_Value(Of Bitrate)(133).ToString) ' Result: kbps_128
' MsgBox(Get_Nearest_Enum_Value(Of KnownColor)(1000)) ' Result: 174
Private Function Get_Nearest_Enum_Value(Of T)(ByVal value As Long) As T

    Return [Enum].Parse(GetType(T), [Enum].GetValues(GetType(T)) _
                                          .Cast(Of Object) _
                                          .OrderBy(Function(br) Math.Abs(value - br)) _
                                          .First)

End Function

· 最も近い下位の列挙値を取得:

' Enum Bitrate As Short : kbps_128 = 128 : kbps_192 = 192 : kbps_256 = 256 : kbps_320 = 320 : End Enum
' MsgBox(Get_Nearest_Lower_Enum_Value(Of Bitrate)(190).ToString) ' Result: kbps_128
' MsgBox(Get_Nearest_Lower_Enum_Value(Of Bitrate)(196).ToString) ' Result: kbps_192
Private Function Get_Nearest_Lower_Enum_Value(Of T)(ByVal value As Integer) As T

    Select Case value

        Case Is < [Enum].GetValues(GetType(T)).Cast(Of Object).First
            Return Nothing

        Case Else
            Return [Enum].Parse(GetType(T), [Enum].GetValues(GetType(T)) _
                                                  .Cast(Of Object) _
                                                  .Where(Function(enum_value) enum_value <= value) _
                                                  .Last)
    End Select

End Function

· 最も近い上位の列挙値を取得:

' Enum Bitrate As Short : kbps_128 = 128 : kbps_192 = 192 : kbps_256 = 256 : kbps_320 = 320 : End Enum
' MsgBox(Get_Nearest_Higher_Enum_Value(Of Bitrate)(196).ToString) ' Result: kbps_256
' MsgBox(Get_Nearest_Higher_Enum_Value(Of KnownColor)(1000)) ' Result: 0
Private Function Get_Nearest_Higher_Enum_Value(Of T)(ByVal value As Integer) As T

    Select Case value

        Case Is > [Enum].GetValues(GetType(T)).Cast(Of Object).Last
            Return Nothing

        Case Else

            Return [Enum].Parse(GetType(T), [Enum].GetValues(GetType(T)) _
                                  .Cast(Of Object) _
                                  .Where(Function(enum_value) enum_value >= value) _
                                  .First)
    End Select

End Function
于 2013-11-01T13:38:40.937 に答える