[解決済み] 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
)ですが、キーとバリューのペアではなく、あくまでセットです。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 辞書から要素を削除する
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' を読み込めませんでした。
-
[解決済み] レイアウトページ"~/Views/Shared/_Layout.cshtml "では、以下のセクションは定義されていますが、レンダリングは行われていません。"スクリプト"
-
[解決済み] "Exception has been thrown by an target of invocation" エラー (mscorlib)
-
[解決済み] aspnet:MaxHttpCollectionKeys の最大値。
-
[解決済み] 403 - 閲覧禁止です。アクセスが拒否されました。提供された資格情報を使用してこのディレクトリまたはページを表示する権限がありません。
-
[解決済み] IIS 7 Error "A specified logon session does not exist. それはすでに終了している可能性があります" https使用時
-
[解決済み] ASP.NETのボタンに画像を追加することはできますか?
-
[解決済み] Temporary ASP.NET Files」フォルダは何のためにあるのですか?
-
[解決済み] VB.netで辞書を使うには?
-
[解決済み] IIS 7、HttpHandlerとHTTPエラー500.21