2016-07-14 13 views
1

2つのコレクションがあり、それぞれの要素をループして各コレクションの対応する要素を比較して、コレクションが同一であるかどうかを判断します。Cで同じコレクションを比較する2つのコレクションをループする

これはforeachループで可能ですか、またはカウンタを使用してインデックスで要素にアクセスする必要がありますか?

一般的に言って、オペレータのオーバーロードのように、コレクションが等しいかどうかを比較するための好ましい方法がありますか?

TIA。

+0

可能性のある重複した[C#でコレクションを比較するために、組み込みの方法はありますか?](http://stackoverflow.com/questions/43500/is-組み込みメソッドと比較するコレクションの比較 – Ivan

答えて

4

この目的で使用される.SequenceEqualメソッドを使用できます。 Moreを読んでください。

リンクが何らかの理由で停止または削除された場合の例を以下に示します。

の要素を、その型に既定の等価比較子を使用して比較することによって、2つのシーケンスが等しいかどうかを判断します。

SequenceEqual(IEnumerableを、IEnumerableを) 方法は、並列に2つのソースの配列を列挙し TSOURCE、既定のデフォルトの等値比較を使用して 対応する要素を比較します。既定の等価比較器の既定値は、 は、IEqualityComparer 汎用インターフェイスを実装する種類の値を比較するために使用されます。カスタムデータ型を比較す​​るには、 にこのインターフェイスを実装し、型に対して独自のGetHashCodeおよびEquals メソッドを提供する必要があります。

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. 
*/ 

あなただけではなく、彼らの参照を比較するのシーケンス 内のオブジェクトの実際のデータを比較したい場合は、あなたのクラスで たIEqualityComparerジェネリックインターフェイスを実装する必要があります。次の コード例は、このインターフェイスをカスタムデータ 型で実装し、GetHashCodeおよびEqualsメソッドを提供する方法を示しています。

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; 
    } 
} 

使用方法:の

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

なぜ戻りませんか?return code == other.Code && Name == other.Name; '? 'Code'と' Name'( 'int'と' string')の型は '=='でうまくいく密封型であることが分かります。 Name.Eqaulsを持つあなたのソリューションは 'Name'が' null'( 'GetHashCode'で扱うことを選択した状況)であれば爆発します。 –

+0

@JeepeStigNielsen説明したように、この例はMSDNから直接取得したものです。 – user3185569

+0

それは私がそれを批判するのを妨げない。 –

関連する問題