2016-07-14 17 views
1

Ich habe zwei Sammlungen und ich möchte jedes Element durchlaufen und vergleichen Sie die entsprechenden Elemente in jeder Sammlung auf Gleichheit und damit feststellen, ob die Sammlungen identisch sind.Schleife durch zwei Sammlungen zum Vergleichen für identische Sammlungen in C#

Ist dies mit einer foreach-Schleife möglich oder muss ich einen Zähler verwenden und auf die Elemente per Index zugreifen?

Allgemein gibt es eine bevorzugte Methode zum Vergleichen von Sammlungen für Gleichheit, wie Überladen eines Operators?

TIA.

+0

Mögliches Duplikat [? Gibt es eine integrierte Methode zur Sammlung in C# vergleichen] (http://stackoverflow.com/questions/43500/is- there-a-built-in-method-to-compare-collections-in-c) – Ivan

Antwort

4

Sie können die für diesen Zweck verwendete Methode .SequenceEqual verwenden. Lesen Sie More.

Beispiele unten, wenn die Verbindung aus irgendeinem Grund unterbrochen oder entfernt wurde.

Bestimmt, ob zwei Sequenzen gleich sind, indem die Elemente mithilfe des standardmäßigen Gleichheitsvergleichs für ihren Typ verglichen werden.

Die SequenceEqual (IEnumerable, IEnumerable) Verfahren zählt die beiden Quellsequenzen parallel und vergleicht entsprechende Elemente mit den Standardgleichheitsvergleich für TSource, Standard verwenden. Der Standard-Gleichheitsvergleich, Standard, wird verwendet, um Werte der Typen zu vergleichen, die die generische Schnittstelle IEqualityComparer implementieren. Um einen benutzerdefinierten Datentyp zu vergleichen, müssen Sie diese Schnittstelle implementieren und Ihre eigenen Methoden GetHashCode und Equals für den Typ bereitstellen.

class Pet 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public static void SequenceEqualEx1() 
{ 
    Pet pet1 = new Pet { Name = "Turbo", Age = 2 }; 
    Pet pet2 = new Pet { Name = "Peanut", Age = 8 }; 

    // Create two lists of pets. 
    List<Pet> pets1 = new List<Pet> { pet1, pet2 }; 
    List<Pet> pets2 = new List<Pet> { pet1, pet2 }; 

    bool equal = pets1.SequenceEqual(pets2); 

    Console.WriteLine(
     "The lists {0} equal.", 
     equal ? "are" : "are not"); 
} 

/* 
    This code produces the following output: 

    The lists are equal. 
*/ 

Wenn Sie die aktuellen Daten der Objekte in den Sequenzen anstatt nur den Vergleich ihrer Referenzen vergleichen wollen, müssen Sie die IEqualityComparer generische Schnittstelle in Ihrer Klasse implementieren. Das folgende Codebeispiel zeigt, wie diese Schnittstelle in einem benutzerdefinierten Datenformat implementiert wird und die Methoden GetHashCode und Equals bereitgestellt werden.

public class Product : IEquatable<Product> 
{ 
    public string Name { get; set; } 
    public int Code { get; set; } 

    public bool Equals(Product other) 
    { 

     //Check whether the compared object is null. 
     if (Object.ReferenceEquals(other, null)) return false; 

     //Check whether the compared object references the same data. 
     if (Object.ReferenceEquals(this, other)) return true; 

     //Check whether the products' properties are equal. 
     return Code.Equals(other.Code) && Name.Equals(other.Name); 
    } 

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects. 

    public override int GetHashCode() 
    { 

     //Get hash code for the Name field if it is not null. 
     int hashProductName = Name == null ? 0 : Name.GetHashCode(); 

     //Get hash code for the Code field. 
     int hashProductCode = Code.GetHashCode(); 

     //Calculate the hash code for the product. 
     return hashProductName^hashProductCode; 
    } 
} 

Verbrauch:

Product[] storeA = { new Product { Name = "apple", Code = 9 }, 
          new Product { Name = "orange", Code = 4 } }; 

Product[] storeB = { new Product { Name = "apple", Code = 9 }, 
          new Product { Name = "orange", Code = 4 } }; 

bool equalAB = storeA.SequenceEqual(storeB); 

Console.WriteLine("Equal? " + equalAB); 

/* 
    This code produces the following output: 

    Equal? True 
*/ 
+0

Warum nicht 'Rückgabecode == other.Code && Name == other.Name;'? Sie wissen, dass die Typen für 'Code' und' Name' ('int' und' string') versiegelte Typen sind, die gut mit '==' funktionieren. Ihre Lösung mit 'Name.Eqauls' wird explodieren, wenn' Name' 'null' ist (eine Situation, die Sie in' GetHashCode' behandeln). –

+0

@JeppeStigNielsen Wie bereits erwähnt, wird dieses Beispiel direkt von MSDN übernommen. – user3185569

+0

Das hindert mich nicht, es zu kritisieren. –