Сравнение двух общих списков для определенного свойства - PullRequest
0 голосов
/ 10 июля 2010

Я использую VB.NET с .NET 2.0.

У меня есть два списка, и я хочу сравнить списки по определенному свойству объекта, а не по объекту в целом, и создать новый список, содержащий объекты, которые находятся в одном списке, но не в другом.

myList1.Add(New Customer(1,"John","Doe")
myList1.Add(New Customer(2,"Jane","Doe")

myList2.Add(New Customer(1,"","")

Результат в приведенном выше примере будет содержать одного клиента, Джейн Доу , потому что идентификатор 2 не был во втором списке.

Как вы можете сравнить эти два List<T> или любой IEnumerable<T> в .NET 2.0 (без LINQ)?

Ответы [ 3 ]

3 голосов
/ 10 июля 2010

Вот версия C #, скоро появится VB ...

Dictionary<int, bool> idMap = new Dictionary<int, bool>();
myList2.ForEach(delegate(Customer c) { idMap[c.Id] = true; });

List<Customer> myList3 = myList1.FindAll(
    delegate(Customer c) { return !idMap.ContainsKey(c.Id); });

... и вот перевод VB.Обратите внимание, что VB не имеет анонимных функций в .NET2, поэтому использование методов ForEach и FindAll будет более неуклюжим, чем стандартные циклы For Each:

Dim c As Customer

Dim idMap As New Dictionary(Of Integer, Boolean)
For Each c In myList2
    idMap.Item(c.Id) = True
Next

Dim myList3 As New List(Of Customer)
For Each c In myList1
    If Not idMap.ContainsKey(c.Id) Then
        myList3.Add(c)
    End If
Next
0 голосов
/ 05 марта 2014

Я хочу поделиться своей функцией для сравнения двух списков объектов:

Код:

Public Function CompareTwoLists(ByVal NewList As List(Of Object), ByVal OldList As List(Of Object))
            If NewList IsNot Nothing AndAlso OldList IsNot Nothing Then
                If NewList.Count <> OldList.Count Then
                    Return False
                End If
                For i As Integer = 0 To NewList.Count - 1
                    If Comparer.Equals(NewList(i), OldList(i)) = False Then
                        Return False
                    End If
                Next
            End If
            Return True
End Function

Пример:

Dim NewList as new list (of string) from{"0","1","2","3"} 
Dim OldList as new list (of string) from{"0","1","2","3"} 
messagebox.show(CompareTwoLists(NewList,OldList)) 'return true 

Dim NewList as new list (of string) from{"0","1","2","4"} 
Dim OldList as new list (of string) from{"0","1","2","3"} 
messagebox.show(CompareTwoLists(NewList,OldList)) 'return false
0 голосов
/ 10 июля 2010

Это возможно в c # 2.0.

List<Customer> results = list1.FindAll(delegate(Customer customer)
                          {
                              return list2.Exists(delegate(Customer customer2)
                                               {
                                                   return customer.ID == customer2.ID;
                                               });
                          });
...