如何在VB.net中使用字典?

7

我已经编写了这个函数,可以从字符串数组中自动将性别更正为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

也许这可以帮助您:http://www.dotnetperls.com/dictionary-vbnet - Bishan
2个回答

12
这是一个示例,说明如何实现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 中的键),但它不是键值对,只是一个集合。

3

只需将您的两个数组更改为字典,并使用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

最后的注意事项:只有在数据开始大幅增长时,这种方法才会变得“更有效率”。现在你只有那么几个元素,使用字典甚至可能会更慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接