更快地找到列表重复项

时间:2014-07-04 17:17:32

标签: .net vb.net

我有以下结构:

Public Structure asd
    Public Property st As String
    Public Property hash As String
End Structure

此列表:Dim keys As New List(Of asd)

我正在使用此代码搜索重复项:

   For intOuter As Integer = 0 To keys.Count - 2
        For intInner As Integer = intOuter + 1 To keys.Count - 1
            If keys(intOuter).hash = keys(intInner).hash Then
                TextBox1.Text += keys(intOuter).hash + vbNewLine
                TextBox1.Text += keys(intOuter).st + "-" + keys(intInner).st + vbNewLine
            End If
        Next intInner
    Next intOuter

但是,它需要花费很多时间(列表中有超过100000个元素)。

有没有更快的方法来查找重复项(通过哈希,而不是st)(具有相同哈希的元素)?

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ:group by hash并获取组中包含多个项目的组。

Dim grouped = keys.GroupBy(Function(x) x.hash)
                  .Where(Function(g) g.Count() > 1)
                  .Select(Function(g) New With { .Hash = g.Key, Items = g.ToList() })
                  .ToList()

答案 1 :(得分:2)

我确实做过测试,但我会假设这很慢的原因是因为你每次都在文本框中写信息。您是否尝试过测试速度而不在文本框中显示信息?我认为它会快得多。尝试将信息放在不同的位置(字符串生成器或重复项列表),然后只写入文本框一次。

当分割两个进程(搜索和写入)时。您可以尝试优化其中一个。

另一个选项可能是更改您的数据结构,如果可能有一种Dictionary(Of String,List(Of String)),其中每个哈希都有一个st列表。