1. ホーム
  2. asp.net

[解決済み] VB.netで辞書を使うには?

2022-03-08 12:18:08

質問

この関数は、文字列配列の異なる値から、性別をMまたはFに自動修正するために書きました。これはうまく動作しますが、私の上司は、彼がより効率的であると言った、ディクショナリを使用するように私に言いました。しかし、私は全く分からない。どなたか、これがどのように行われるのかを理解するために私を助けてください?ありがとうございます。

    Public Function AutoGender(ByVal dt As DataTable) As DataTable        

    Dim Gender As String = ""
    Dim Mkeywords() As String = {"boy", "boys", "male", "man", "m", "men", "guy"}
    Dim Fkeywords() As String = {"girl", "girls", "female", "woman", "f", "women", "chick"}
    Dim row As DataRow
        For Each row In dt.Rows
            If Mkeywords.Contains(row("Gender").ToString.ToLower) Then
                Gender = "M"
                row("Gender") = Gender
            ElseIf Fkeywords.Contains(row("Gender").ToString.ToLower) Then
                Gender = "F"
                row("Gender") = Gender
            End If
        Next
    Return dt

    End Function

解決方法は?

をどのように実装するかの例を示します。 Dictionary(Of String, String) を使用して、この同義語が既知かどうかを調べることができます。

Shared GenderSynonyms As Dictionary(Of String, String) = New Dictionary(Of String, String) From
    {{"boy", "M"}, {"boys", "M"}, {"male", "M"}, {"man", "M"}, {"m", "M"}, {"men", "M"}, {"guy", "M"},
     {"girl", "F"}, {"girls", "F"}, {"female", "F"}, {"woman", "F"}, {"f", "F"}, {"women", "F"}, {"chick", "F"}}

Public Function AutoGender(ByVal dt As DataTable) As DataTable
    If dt.Columns.Contains("Gender") Then
        For Each row As DataRow In dt.Rows
            Dim oldGender = row.Field(Of String)("Gender").ToLower
            Dim newGender As String = String.Empty
            If GenderSynonyms.TryGetValue(oldGender, newGender) Then
                row.SetField("Gender", newGender)
            End If
        Next
    End If
    Return dt
End Function

なお、ここでは コレクション初期化子 を埋めるために 辞書 は、コレクションを初期化するためにリテラルを使用する便利な方法です。また Add メソッド .

Edit : より簡潔な別のアプローチとして、2つのメソッドを使用することができます。 HashSet(Of String) 1つは男性の同義語、もう1つは女性の同義語です。

Shared maleSynonyms As New HashSet(Of String) From
    {"boy", "boys", "male", "man", "m", "men", "guy"}
Shared femaleSynonyms As New HashSet(Of String) From
    {"girl", "girls", "female", "woman", "f", "women", "chick"}

Public Function AutoGender(ByVal dt As DataTable) As DataTable
    If dt.Columns.Contains("Gender") Then
        For Each row As DataRow In dt.Rows
            Dim oldGender = row.Field(Of String)("Gender").ToLower
            Dim newGender As String = String.Empty
            If maleSynonyms.Contains(oldGender) Then
                row.SetField("Gender", "M")
            ElseIf femaleSynonyms.Contains(oldGender) Then
                row.SetField("Gender", "F")
            End If
        Next
    End If
    Return dt
End Function

A HashSet は一意でなければならないので、重複する Strings (のキーと同じ)。 Dictionary )ですが、キーとバリューのペアではなく、あくまでセットです。