我想比较两行之间的行并打印它们。我有以下代码来执行此操作
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)
当字符串之前出现一些额外的选项卡时,它不会执行此任务 在比较之前,如何消除一行中的所有选项卡和空格? 谢谢
答案 0 :(得分:0)
您可以使用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)
答案 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())
这与布莱克伍德先生的答案之间的区别在于,这不会改变为ListA
或ListB
加载的数据。它只是在比较时忽略制表符和空格。目前尚不清楚你追求的是哪一个。