Один из способов добиться этого - создать IEqualityComparer<T>
и использовать interface
, чтобы связать два класса вместе.
X
и Y
поля должны быть преобразованы в свойства для реализации interface
.
public interface IInterface
{
string X { get; set; }
string Y { get; set; }
}
class A : IInterface
{
public string X { get; set; }
public string Y { get; set; }
List<B> Z;
}
class B : IInterface
{
public string X { get; set; }
public string Y { get; set; }
}
Тогда вы можете создать IEqualityComparer<T>
.
public class ListComparer : IEqualityComparer<IInterface>
{
public bool Equals(IInterface x, IInterface y)
{
return x.X == y.X && x.Y == y.Y;
}
public int GetHashCode(IInterface obj)
{
unchecked
{
int hash = 17;
hash = hash * 23 * obj.X.GetHashCode();
hash = hash * 23 * obj.Y.GetHashCode();
return hash;
}
}
}
Чтобы проверить их, вы можете использовать следующий код. Это простое использование.
List<A> list1 = new List<A>
{
new A { X = "X1", Y = "Y1"},
new A { X = "X2", Y = "Y2"},
new A { X = "X3", Y = "Y3"}
};
List<B> list2 = new List<B>
{
new B { X = "X3", Y = "Y3"},
new B { X = "X1", Y = "Y1"},
new B { X = "X2", Y = "Y2"}
};
List<A> list1Ordered = list1.OrderBy(x => x.X).ThenBy(x => x.Y).ToList();
List<B> list2Ordered = list2.OrderBy(x => x.X).ThenBy(x => x.Y).ToList();
bool result = list1Ordered.SequenceEqual(list2Ordered, new ListComparer());
Если вы действительно не хотите, чтобы заказать их можно использовать следующее:
bool temp = list1.All(x => list2.Contains(x, new ListComparer()))
&& list2.All(x => list1.Contains(x, new ListComparer()));;
Сравните их как? –
проверить, равны ли списки или нет – Prasann
Возможный дубликат [Сравнить два списка объектов для равенства, игнорируя порядок] (http://stackoverflow.com/questions/3669970/compare-two-listt-objects-for-equality- ignoring-order) –
arbitrarystringofletters