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吗?这样,您的比较方法可以处理选项卡。