2017-01-26 5 views
0

Ich habe zwei Listen von Objekten des Typs A enthaltenVergleicht man Listen von Objekten, die eine Liste von Objekten

class A 
{ 
    string X; 
    string Y; 
    List<B> Z; 
} 

wobei B

class B 
{ 
    string X; 
    string Y; 
} 

Wie kann ich überprüfen, ob sie in C# gleich sind die Reihenfolge ignorieren, in der die Elemente vorhanden sind?

+0

Vergleichen sie wie? –

+0

überprüfen, ob die Listen gleich sind oder nicht – Prasann

+1

Mögliche Duplikat [Vergleichen Sie zwei Listen -Objekte auf Gleichheit, zu ignorieren, um] (http://stackoverflow.com/questions/3669970/compare-two-listt-objects-for-equality- ignoriert Ordnung) – arbitrarystringofletters

Antwort

2

Eine Möglichkeit, dies zu erreichen, wäre, eine IEqualityComparer<T> zu erstellen und eine interface zu verwenden, um die zwei Klassen miteinander zu verknüpfen. Die Felder X und Y müssen in Eigenschaften konvertiert werden, um interface zu implementieren.

public interface IInterface 
{ 
    string X { get; set; } 
    string Y { get; set; } 
} 

class A : IInterface 
{ 
    public string X { get; set; } 
    public string Y { get; set; } 
    List<B> Z; 
} 

class B : IInterface 
{ 
    public string X { get; set; } 
    public string Y { get; set; } 
} 

Dann können Sie die IEqualityComparer<T> erstellen.

public class ListComparer : IEqualityComparer<IInterface> 
{ 
    public bool Equals(IInterface x, IInterface y) 
    { 
     return x.X == y.X && x.Y == y.Y; 
    } 

    public int GetHashCode(IInterface obj) 
    { 
     unchecked 
     { 
      int hash = 17; 
      hash = hash * 23 * obj.X.GetHashCode(); 
      hash = hash * 23 * obj.Y.GetHashCode(); 
      return hash; 
     } 
    } 
} 

Um sie zu überprüfen, können Sie den folgenden Code verwenden. Dies ist eine einfache Verwendung.

List<A> list1 = new List<A> 
{ 
    new A { X = "X1", Y = "Y1"}, 
    new A { X = "X2", Y = "Y2"}, 
    new A { X = "X3", Y = "Y3"} 
}; 
List<B> list2 = new List<B> 
{ 
    new B { X = "X3", Y = "Y3"}, 
    new B { X = "X1", Y = "Y1"}, 
    new B { X = "X2", Y = "Y2"} 
}; 

List<A> list1Ordered = list1.OrderBy(x => x.X).ThenBy(x => x.Y).ToList(); 
List<B> list2Ordered = list2.OrderBy(x => x.X).ThenBy(x => x.Y).ToList(); 

bool result = list1Ordered.SequenceEqual(list2Ordered, new ListComparer()); 

Wenn Sie wirklich nicht, sie bestellen wollte konnte man folgendes verwenden:

bool temp = list1.All(x => list2.Contains(x, new ListComparer())) 
      && list2.All(x => list1.Contains(x, new ListComparer()));; 
Verwandte Themen