[C#] ICompareインターフェースを使用して2つのListを比較する方法


はじめに

Unitテスト時に2つのList<T>の比較をICompareインターフェースを使って比較する際の方法をメモしておきます。

ICompareインタフェースで用意されている「Compare」メソッドは2つのオブジェクトを比較して、一方が他方より小さいか、同じか、または大きいかを示す値を返します。

このCompareメソッドをList<T>に対して比較できる様にします。

 

ICompareインタフェースの詳細は下記を参考にしてください。

IComparer インターフェイス

 

非ジェネリック基本インターフェースを実装する


// メインのテストメソッド
[TestMethod]
public void Test()
{
    List<Animal> list1 = new List<Animal> ()
    {
       new Animal("Dog", "Charlie"),
       new Animal("Cat", "Mittens"),
       new Animal("Cow", "Bacon"),
    };

    List<Animal> list2 = new List<Animal> ()
    {
       new Animal("Dog", "Charlie"),
       new Animal("Cat", "Mittens"),
       new Animal("Cow", "Bacon"),
    };

    // 基本的には、下記で可能
    CollectionAssert.AreEqual(list1, list2, new CustomCompare());

    // カスタムメッセージをもつ場合
    CollectionAssert.AreEqual(list1, list2, new CustomCompare(), "true");
}

// Animalクラス
public class Animal
{
    public string Breed { get; set; }

    public string Name { get; set; }
}

// カスタム比較クラスを実装する
public class CustomCompare : IComparer<Animal>, IComparer
{
    public int Compare(Animal a, Animal b)
    {
        return String.Compare(a.Name, b.Name);
    }

    int IComparer.Compare(object x, object y)
    {
        return Compare((Animal)x, (Animal)y);
    }
}

 

最後に

単体テストでのオブジェクトの比較の場合、継承し、独自クラスを利用することで様々な比較を行うことができます。

是非ためしてみてください。