2010-12-21 13 views
0

Wie vergleiche ich zwei generische Listen (von cSystem) in meiner cSystemCatalog-Klasse? Ich möchte wissen, wenn man von der Liste mehr oder weniger Klassenobjekte enthält, möchte ich auch _systemKey und _systemNamezwei generische Liste vergleichen, die Klassenobjekte enthält

Public Class cSystemCatalog 
    Private _systems As List(Of cSystem) 

Public Class cSystem 
    Private _systemKey As Int32 
    Private _systemName As String 

Antwort

1
If _systems1.Count > _systems2.Count Then 
+0

Ihre Antwort ist richtig, aber wie soll ich tun, wenn ich will auch SystemKey vergleichen und Systemname? –

1
If _systems1.Count = _systems2.Count AndAlso _ 
_systems1.All(Function(s1) _systems2.Any(Function(s2) _ 
s2._systemKey = s1._systemKey AndAlso s2._systemName = s1._systemName)) Then 

Vorausgesetzt, Sie können LINQ verwenden vergleichen:

Imports System.LINQ 
0

I eine Lösung durch Implementierung der IEquatable-Schnittstelle gefunden.

Public Class cSystem Implements IEquatable(Of cSystem) 
    Private _systemKey As Int32 
    Private _systemName As String 

Public Overloads Function Equals(ByVal other As cSystem) As Boolean Implements IEquatable(Of cSystem).Equals 
    If other Is Nothing Then Return False 
    If _systemKey = other.SystemKey AndAlso _systemName = other.SystemName Then 
     Return True 
    Else 
     Return False 
    End If 
End Function 

Public Overrides Function Equals(ByVal obj As Object) As Boolean 
    If obj Is Nothing Then Return MyBase.Equals(obj) 

    If Not TypeOf obj Is cSystemThen 
     Throw New InvalidCastException("The 'obj' argument is not a cSystemobject.") 
    Else 
     Return Equals(DirectCast(obj, cSystem)) 
    End If 
End Function 

Public Shared Operator =(ByVal system1 As cSystem, ByVal system2 As cSystem) As Boolean 
    Return system1.Equals(system2) 
End Operator 

Public Shared Operator <>(ByVal system1 As cSystem, ByVal system2 As cSystem) As Boolean 
    Return Not system1.Equals(system2) 
End Operator 

dann verwende ich die Methode auf der Liste enthält die allgemeinen Listen mit cSystem Klasse Objekte zu vergleichen:

Dim valuesHasBeenChanged As Boolean 
If objSystemCatalog.Systems.Count = objOldSystemCatalog.Systems.Count Then 
    For Each system As cSystem In objSystemCatalog.Systems 
     If objOldSystemCatalog.Systems.Contains(system) = False Then 
      valuesHasBeenChanged = True 
     End If 
    Next 
ElseIf objSystemCatalog.Systems.Count > objOldSystemCatalog.Systems.Count Then 
    valuesHasBeenChanged = True 
ElseIf objSystemCatalog.Systems.Count < objOldSystemCatalog.Systems.Count Then 
    valuesHasBeenChanged = True 
End If