使用IEnumerable比较两个字符串

时间:2016-05-17 20:56:28

标签: vb.net

我想比较两行之间的行并打印它们。我有以下代码来执行此操作

Dim linesA As [String]() = File.ReadAllLines(TextBox1.Text)
Dim linesB As [String]() = File.ReadAllLines(TextBox2.Text)

Dim onlyB As IEnumerable(Of [String]) = linesB.Except(linesA)

当字符串之前出现一些额外的选项卡时,它不会执行此任务 在比较之前,如何消除一行中的所有选项卡和空格? 谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用Select扩展名方法处理每一行,然后将其存储在linesAlinesB中。例如,如果您只想删除前导和尾随空格字符,则可以使用Trim函数。

Dim linesA As IEnumerable(Of String) = IO.File.ReadAllLines(TextBox1.Text).Select(Function(l) l.Trim)
Dim linesB As IEnumerable(Of String) = IO.File.ReadAllLines(TextBox2.Text).Select(Function(l) l.Trim)

Dim onlyB As IEnumerable(Of String) = linesB.Except(linesA)

答案 1 :(得分:0)

如果一行有一个前导标签而另一行没有,则它们不相等,因此默认比较不起作用。但是Except有一个重载,允许您指定一个自定义Equality比较器,您可以在其中提供自己的比较逻辑:

Public Class LineComparer
    Implements IEqualityComparer(Of String)

    Public Function Equals1(x As String, y As String) As Boolean _
                         Implements IEqualityComparer(Of String).Equals
        Return (String.Compare(x.Trim(), y.Trim(), StringComparison.OrdinalIgnoreCase) = 0)
    End Function

    Public Function GetHashCode1(obj As String) As Integer _
                              Implements IEqualityComparer(Of String).GetHashCode
        Return obj.Trim().GetHashCode
    End Function
End Class

请注意,Except使用GetHashCode1进行比较。

用法:

Dim justB = linesB.Except(linesA, New LineComparer())

这与布莱克伍德先生的答案之间的区别在于,这不会改变为ListAListB加载的数据。它只是在比较时忽略制表符和空格。目前尚不清楚你追求的是哪一个。