Vb.net 使用IEnumerable比较两个字符串

Vb.net 使用IEnumerable比较两个字符串,vb.net,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) 当字符串前面出现一些额外的制表符时,它不起作用 在比较一行中的制表符和空格

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

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)
当字符串前面出现一些额外的制表符时,它不起作用 在比较一行中的制表符和空格之前,如何消除它们?
谢谢

您可以使用
选择
扩展方法来处理每一行,然后再将它们存储在
linesA
linesB
中。例如,如果您只想去掉前导和尾随空格字符,可以使用
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)

您可以使用
Select
扩展方法处理每一行,然后再将它们存储在
linesA
linesB
中。例如,如果您只想去掉前导和尾随空格字符,可以使用
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)

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

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())

这与Blackwood先生的答案之间的区别在于,这不会改变为
ListA
ListB
加载的数据。在比较时,它只会忽略制表符和空格。不清楚您要的是哪一行。

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

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())

这与Blackwood先生的答案之间的区别在于,这不会改变为
ListA
ListB
加载的数据。在比较时,它只会忽略制表符和空格。现在还不清楚您要的是哪一个。

您可以创建自己的类来实现IEnumerable和IComparable吗?这样,您的比较方法可以处理制表符。您可以创建自己的类来实现IEnumerable和IComparable吗?这样,您的比较方法可以处理选项卡。