Существует полезный оператор LINQ, который называется SequenceEqual()
, который сравнивает две последовательности для равенства.SequenceEqual()
проходит через любые две последовательности IEnumerable<>
и проверяет, что они имеют одинаковое количество элементов и что элементы в одном и том же индексе равны (с использованием сравнения по умолчанию). Однако, поскольку у вас есть вложенные коллекции, вам необходимо расширить понятие равенства и применить к ним. К счастью, есть перегрузка, которая позволяет вам снабжать свой собственный объект IEqualityComparer<>
.
Поскольку неудобно постоянно определять класс, чтобы обеспечить семантику равенства, я написал общее расширение, которое позволяет вместо этого использовать делегат. Давайте посмотрим на код:
public static class ComparerExt
{
private class GenericComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> m_EqualityFunc;
public GenericComparer(Func<T,T,bool> compareFunc)
{
m_EqualityFunc = compareFunc;
}
public bool Equals(T x, T y)
{
return m_EqualityFunc(x, y);
}
}
// converts a delegate into an IComparer
public static IEqualityComparer<T> AreEqual<T>(Func<T,T,bool> compareFunc)
{
compareFunc.ThrowIfNull("compareFunc");
return new GenericComparer<T>(compareFunc);
}
}
Теперь мы можем сравнить две последовательности достаточно легко:
Assert.IsTrue(
// check that outer sequences are equivalent...
a1.SequenceEqual(a2,
// define equality as inner sequences being equal...
ComparerExt.AreEqual((a,b) => a.SequenceEqual(b)));
Что вы спрашиваете ....? –
Должны ли они быть равными или нет? Соответствует ли позиция в массиве? –
Ну, они равны, поэтому я ожидаю, что AreEquivalent будет правдой. – wysek