计算列表框中的重复项,然后将其添加到另一个列表框

时间:2016-09-19 20:32:09

标签: .net vb.net count listbox duplicates

我正在尝试为简单的库数据库系统创建一个“搜索引擎”(sorta)。

作为对我真正想做的事情的简要描述,我想创建一个连接到访问数据库的搜索引擎程序,该程序搜索与书籍相关联的“标签”。

标记或关键字是搜索框可以使用的选项。因此,您可以在书本身中搜索标签,而不是搜索名称。标签可以包含任何内容 - 从书的主题,如果它是书或轻小说,等等,

例如:我在搜索中输入:“恐怖片”,标签上会出现大量带有“恐怖片”的书籍。

这很好,但作为一个搜索引擎,它不够准确。使用我当前的代码,只要我输入与特定书籍匹配的标签,就可以了。如果我输入“恐怖冒险”,它就不够具体,因为它仍然会列出恐怖的书籍。

我的代码所做的是根据搜索输入的空间分割搜索输入。在标签本身,它也用它的逗号分割它们。因此,在数据库中,您会看到标签为“恐怖,冒险,浪漫”。然后它们都被迭代成两个For循环,以将每个分割搜索字符串与分割标记字符串进行比较。如果匹配,则将其添加。 它的代码是:

Dim comparenew As String
  Dim splittag As String
    For Each comparenew In search
      For Each splittag In compare
      If splittag.Contains(comparenew) = True And comparenew <> "" And comparenew.Count <> 1 Then
        If Not frmList.lstBooks.Items.Contains(dr("BookName").ToString()) Then 
          frmList.lstBooks.Items.Add(dr("BookName").ToString())
        End If
      End If
    Next
  Next
Next

通常,这会导致在列表中添加同一本书的多个实例,但我已经在列表框中添加了防止重复项,这是“if not”语句。

但我想利用这种重复来衡量准确性。重复次数越多,搜索结果越好。

假设用户输入的搜索最多导致两(2)个重复项目。首先将2个重复的项目添加到另一个列表框中,然后在末尾添加其余的重复项目。

如果这有点令人困惑,这意味着它并不总是在列表框中添加“最重复”的项目,它也会添加较少的重复数。

这是另一个例子: 假设用户搜索过: “ 喜剧喜剧冒险故事,时间旅行 ”。

5本书与“”,“喜剧”,“冒险”和“时间旅行“匹配。 它们会自动添加到列表中 。 (这意味着这5本书每本重复4次)

2本书与“喜剧”,“冒险”和“时间旅行”匹配。 他们已被添加到列表 (这意味着这两本书每次重复3次)

10本书与“”,“喜剧”和“冒险”相匹配。 他们也被添加到列表中 (10本书各有3本重复)

25本书与“”和“喜剧”相匹配。 但是它们没有添加到列表中 (它们只重复了两次)

希望每个人都能理解这个例子,我认为这有点清楚。正如您所看到的,有一个“级别”,即使它们不是项目中“最重复”的结果,也会添加结果。它只是下面的一个数,但这是搜索引擎上的问题,因为我不知道如何编码它。我想先计算重复项,然后将它放在数组上进行比较。我不太确定代码如何适用于此。

有没有人可以帮我解决这个问题?如果您需要代码,请告诉我,或者让您更清楚。我试图寻找类似的东西,但只找到关于计算重复的结果,或者只是删除它们。

1 个答案:

答案 0 :(得分:1)

好的,所以我觉得我对此有一个心理障碍,因为我在发布这个问题后的第二天就能解决自己的问题。

使用this code here作为“计算”列表框中重复项数量的方法,我对其进行了一些修改以满足我的需求。

首先,我添加了一个名为“Max”的变量来获得最多的重复数。之后,如果重复次数大于或等于“Max”,我添加了if语句 - 1.就是这样,我能够在列表框中获得前两个重复项。这是修改后的代码:

    Try
        For Each nItem As String In lBox.Items
            If Not (lItems.ContainsKey(nItem)) Then 
                strCurrentItem = nItem
                For Each sItem As String In lBox.Items
                    If sItem.Equals(strCurrentItem) Then 
                        intCount += 1
                    End If
                Next
                If max < intCount Then
                    max = intCount
                End If
                lItems.Add(nItem, intCount)
                intCount = 0
                strCurrentItem = String.Empty
            End If
        Next

        For i As Integer = 0 To lItems.Count - 1
            If lItems.Values(i) >= max - 1 Then
                frmList.lstBooks.Items.Add(lItems.Keys(i).ToString)
            End If
        Next