Я собираюсь сделать ряд предположений здесь, которые могут быть неправильно в вашем случае , Вам действительно нужно уточнить некоторые моменты о том, как это сравнение должно работать:
- Предположительно, вы хотите сравнить отдельные значения в списках; если два списка содержат одни и те же значения в одной и той же позиции, их следует считать равными, даже если они фактически являются разными объектами списка.
- Поскольку вы выбрали
List
для обоих измерений (а не что-то вроде Hashset
) Я предполагаю, что порядок важен - {"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