[英]How to use Dictionary in VB.net?
我已经编写了这个函数来自动从字符串数组中的不同值中将性别更正为M或F. 它工作正常但我的经理告诉我使用Dictionary,他说效率更高。 但我不知道。 有谁想帮我理解如何做到这一点? 谢谢。
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
方法 。
编辑 :另一种可能更简洁的方法是使用两个HashSet(Of String)
,一个用于男性同义词,一个用于女性:
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
HashSet
也必须是唯一的,因此它不能包含重复的Strings
(如Dictionary
的键),但它不是键值对而只是一组。
只需将两个数组都更改为字典,然后执行ContainsKey
而不是Contains
。
Dim Mkeywords = New Dictionary(Of String, String) From
{{"boy", ""}, {"boys", ""}, {"male", ""}, {"man", ""}, {"m", ""}, {"men", ""}, {"guy", ""}}
(并为女性效仿)
但是,你可能已经注意到我放入了所有空字符串。 这是因为字典有值和键,但由于我们没有使用这些值,所以我将它们作为空字符串。 要使用相同的O(1)
查找但避免所有无关的值,可以以类似的方式使用HashSet
。
现在你要改变的就是像我说的那样,使用ContainsKey
(或者如果你去那条路线那么HashSet
,它仍然只是Contains
):
If Mkeywords.ContainsKey(row("Gender").ToString.ToLower) Then
最后要注意的是:如果数据开始大幅增长,这只会“更有效”。 就像你拥有它一样,只有少数几个元素,使用字典甚至可能会更慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.