我要做出一些假设在这里,这可能是你的情况不正确。你真的需要澄清一下这个比较应该如何工作的一些观点:
- 大概你想比较列表中的单个值;如果两个列表在同一位置包含相同的值,即使它们实际上是不同的列表对象,它们也应该被视为相等。
- 既然你选择了
List
这两个维度(而不是像)我认为这个顺序很重要 - {"a","b"}
不等于{"b","a"}
。
- 如果一个
List(Of String)
比另一个长,那么相应的结果列表将与较长的列表一样长,但填充的差异值为Nothing
。
- 根据您选择的
List(Of List(Of String))
来存储结果,我假设您想要返回相应位置上等价的值;非等价值将在相应的结果中有Nothing
。
- 既然你使用的是VB.NET,我假设你想要一个不区分大小写的比较。
我建议增加以下两种扩展方法:
Imports System.Runtime.CompilerServices
Module ListFunctions
Public Function MaxLength(Of T)(l1 As List(Of T), l2 As List(Of T)) As T
Dim l1Length = If(l1?.Count,0)
Dim l2Length = If(l2?.Count,0)
Return Math.Max(l1Length, l2Length)
End Function
<Extension()> Public Function TryGet(Of T)(l As List(Of T), idx As Integer) As T
If If(l?.Count, 0) <= idx Then Return Nothing
Return l(idx)
End Function
End Module
然后,你的代码块中:
Dim listComparer = Function(l1 As List(Of String), l2 As List(Of String))
Return Enumerable.Range(0, MaxLength(l1,l2)).Select(Function(i)
Dim s1 = l1.TryGet(i)
Dim s2 = l2.TryGet(i)
If s1 = s2 Then Return s1
Return Nothing
End Function).ToList
End Function
Dim listsComparer = Function(ll1 As List(Of List(Of String)), ll2 As List(Of List(Of String)))
Return Enumerable.Range(0, MaxLength(ll1,ll2)).Select(Function(i)
Dim l1 = ll1.TryGet(i)
Dim l2 = ll2.TryGet(i)
Return listComparer(l1,l2)
End Function).ToList
End Function
Dim ListResult = listsComparer(ListV1, ListV2)
[VB.NET的
可能重复:检查列表项是相等的,并具有相同的计数](http://stackoverflow.com/questions/17787538/vb-net-check-if-list-items-are-equal-and-have-same-count) – mikeyq6