作り直された答え
オブジェクトの等価性をチェックCollectionAssert.AreEqual(IEnumerable, IEnumerable, IComparer)
する実装を使用して、2 つのコレクションに同じオブジェクトが同じ順序で含まれていることをアサートするオーバーロードがあります。IComparer
上記のシナリオでは、順序は重要ではありません。ただし、2 つのコレクションに複数の同等のオブジェクトが存在する状況にも十分に対応するには、最初に各コレクション内のオブジェクトを並べ替え、1 つずつ比較して同等のオブジェクトの数も同じであることを確認する必要があります。 2つのコレクションで。
Enumerable.OrderBy
IComparer<T>
引数を取るオーバーロードを提供します。2 つのコレクションが同じ順序で並べ替えられるようにするには、識別プロパティの型が を実装する必要がありますIComparable
。IComparer
との両方のIComparer<Foo>
インターフェイスを実装する比較クラスの例を次に示します。ここでは、Bar
順序付け時に が優先されると想定されています。
public class FooComparer : IComparer, IComparer<Foo>
{
public int Compare(object x, object y)
{
var lhs = x as Foo;
var rhs = y as Foo;
if (lhs == null || rhs == null) throw new InvalidOperationException();
return Compare(lhs, rhs);
}
public int Compare(Foo x, Foo y)
{
int temp;
return (temp = x.Bar.CompareTo(y.Bar)) != 0 ? temp : x.Bar2.CompareTo(y.Bar2);
}
}
2 つのコレクション内のオブジェクトが同じであり、同じ数である (ただし、最初から同じ順序である必要はありません) ことを主張するには、次の行でうまくいきます。
var comparer = new FooComparer();
CollectionAssert.AreEqual(
expectedCollection.OrderBy(foo => foo, comparer),
foundCollection.OrderBy(foo => foo, comparer), comparer);