VB.NET - List.Contains返回False但应该为True

时间:2016-07-31 09:43:57

标签: vb.net visual-studio visual-studio-2015

我看了List.Contains returns false, even though it seems it should return true,但他的代码结构与我的有点不同,所以我不确定我是否有同样的问题。

在我继续之前,让我解释一下我的结果应该是什么。 我们有2个输入文件,文件1包含email:hash,另一个包含email:hashemail:plain

结束输出:如果第二个文件在明文之后有明文:,输出它(确保在输出文件1的电子邮件时不复制:如果没有为该电子邮件/哈希创建文件2行,则为哈希),否则输出哈希

tl; dr - 基本上将第二个文件overwrite prioritized放在第一个文件上。

(First File Randomized)
ABC_123@gmail.com:f6deea50e7eeb2d930fab83ccc32cdfe
123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
abc123@email.com:2d366131008f89781b8379bed3451656

(Second File Randomized)
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd

Output should be:
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd

(Output from Tests - "->" lines shouldn't be outputted.)
123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
->123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806
123abc@domain.ext:aaaaaaaa
ABC_123@gmail.com:cccccccc
->ABC_123@gmail.com:f6deea50e7eeb2d930fab83ccc32cdfe
abc123@email.com:bbbbbbbb
newemail@hotmail.com:ddddddddd

在第二个OpenFileDialog块中,它始终返回false,直到For Each combo as Match in matches中的最后一行。 奇怪的是,如果我将第二个正则表达式从(.*)@(.*):(.*)更改为(.*)@(.*):([a-f0-9]{32})它出于某种原因可行,那么问题是它只匹配Email@domain.ext:{md5}并且不匹配例如{{1这是一个要求。
(最新的代码更新,我在试图修复它时更加破坏了它,所以现在甚至无法工作)。

我睡了一次然后重新尝试修复它,到目前为止我几乎都在那里,除了一个电子邮件之外它正确覆盖:哈希出于某种原因。

Image showing error 正如你所看到的,它将123abc@domain.ext从散列更改为aaaaaaa,但对于ABC_123@gmail.com,它并没有出于某种奇怪的原因。同样是的,abc123 @email.com散列确实发生了变化,所以奇怪的是随机电子邮件:hash没有改变。

我一直在这个约<罢工> 9 12个多小时。 (没有夸大其词),我真的很喜欢对正在发生的事情的启发。

我已经尝试了很多替代品,以至于我现在甚至都记不住了。

代码:(更新后的x3)
提醒:请阅读以上关于我想要实现的目标:)

Email@domain.ext:abc123

2 个答案:

答案 0 :(得分:0)

嗨,我认为这应该适合你的需要。

    Dim ofd = New OpenFileDialog()
    ofd.Title = "Import..."
    ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    ofd.Filter = "Text files|*.txt"
    ofd.Multiselect = True

    Dim output As New Dictionary(Of String, String) 'key = mail, value = plain/hash

    If (ofd.ShowDialog() = DialogResult.OK And ofd.CheckFileExists = True) Then

        For Each filename As String In ofd.FileNames
            Using sr As New StreamReader(filename)

                Dim combos As MatchCollection = New Regex("(.*)@(.*):(.*)").Matches(sr.ReadToEnd)

                For Each match As Match In combos
                    Dim tmp() As String = Split(match.ToString, ":")
                    tmp(1) = tmp(1).Replace(vbCr, "").Replace(vbLf, "") 'Delete carriage return
                    If Not output.ContainsKey(tmp(0)) Then
                        output.Add(tmp(0), tmp(1))
                    Else
                        If output(tmp(0)).Length = 32 Then 'condition whether to change the value or not. You need to design it to your needs.
                            output(tmp(0)) = tmp(1)
                        End If
                    End If
                Next match
            End Using

        Next filename
    End If

我不知道您的数据中是否有回车。我尝试使用简单的txt文件。 您需要根据需要更改条件。我看到哈希有32个标志,而纯文本则没有......

答案 1 :(得分:0)

你想要的是你拥有的两组线的联合,而这正是Enumerable.Union所提供的,只要我们有办法区分相等的元素。

从这开始我们首先定义相等比较器:

Class MailEqualityComparer
    Implements IEqualityComparer(Of String)

    Overloads Function Equals(mail1 As String, mail2 As String) As Boolean Implements IEqualityComparer(Of String).Equals
        ' assume input validated
        Return mail1.Split(":"c)(0).Equals(mail2.Split(":"c)(0))
    End Function

    Overloads Function GetHashCode(mail As String) As Integer Implements IEqualityComparer(Of String).GetHashCode
        ' assume input validated
        Return mail.Split(":"c)(0).GetHashCode
    End Function
End Class

对于这个类,如果它们在:之前的部分相等,那么两个字符串是相等的。

然后你只需要使用该类的实例来确保正确的相等:

    ' file1 and file2 are String arrays
    ' they could be the result of File.ReadAllLines for example

    Dim file1 = {
        "ABC_123@gmail.com: f6deea50e7eeb2d930fab83ccc32cdfe",
        "123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806",
        "123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd",
        "abc123@email.com: 2d366131008f89781b8379bed3451656"
    }

    Dim file2 = {
        "123abc@domain.ext: aaaaaaaa",
        "ABC_123@gmail.com: cccccccc",
        "abc123@email.com: bbbbbbbb",
        "newemail@hotmail.com: ddddddddd"
    }

    ' result is an IEnumerable(Of String)
    ' add ToArray (for example) if you want to materialize the result
    Dim result = file2.Union(file1, New MailEqualityComparer) ' note the order ; it matters

    ' result content :
    ' ----------------
    ' 123abc@domain.ext: aaaaaaaa
    ' ABC_123@gmail.com: cccccccc
    ' abc123@email.com: bbbbbbbb
    ' newemail@hotmail.com: ddddddddd
    ' 123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd

它只是让我们“我们如何确定联盟参数的顺序?” 为此,我们必须知道哪个文件包含“纯文本”内容,以及您在撰写本文时未提供的信息。

(注意:使用Hashset(Of String)SortedSet(Of String)及其UnionWith方法可以实现相同的目标) [SortedSet需要IComparer(Of String)而不是IEqualityComparer(Of String)]

评论后编辑

如果我理解你的评论(我不确定);这是使用SortedSet可以完成的事情:

Class MailComparer
    Implements IComparer(Of String)

    Function Compare(mail1 As String, mail2 As String) As Integer Implements IComparer(Of String).Compare
        ' assume input validated
        Return mail1.Split(":"c)(0).CompareTo(mail2.Split(":"c)(0))
    End Function
End Class

' file1 and file2 are String arrays
' they could be the result of File.ReadAllLines for example
Dim file1 = {
    "ABC_123@gmail.com: f6deea50e7eeb2d930fab83ccc32cdfe",
    "123abc@domain.ext:82e6eeea4060c90cc3dc6ddd25885806",
    "123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd",
    "abc123@email.com: 2d366131008f89781b8379bed3451656"
}

Dim file2 = {
    "123abc@domain.ext: aaaaaaaa",
    "ABC_123@gmail.com: cccccccc",
    "abc123@email.com: bbbbbbbb",
    "newemail@hotmail.com: ddddddddd"
}

' allLines is an IEnumerable(Of String)
Dim allLines = file2.Concat(file1) ' note the order ; it matters

Dim result As New SortedSet(Of String)(allLines, New MailComparer)

' result content :
' ----------------
' 123_ABC@gmail.com:8fa5104d4d995dc153e5509ab988bcfd
' 123abc@domain.ext: aaaaaaaa
' ABC_123@gmail.com: cccccccc
' abc123@email.com: bbbbbbbb
' newemail@hotmail.com: ddddddddd

我没有看到使用8行类的地方并不简单;但也许我错过了这一点......