Вы можете использовать метод Enumerable.Except()
.При этом используется компаратор (либо по умолчанию, либо тот, который вы указали) для оценки того, какие объекты находятся в обеих последовательностях, или только в одном:
var sequenceA = new[] { "a", "e", "i", "o", "u" };
var sequenceB = new[] { "a", "b", "c" };
var sequenceDiff = sequenceA.Except( sequenceB );
Если вы хотите выполнить полное разделение обеих последовательностей (A-B) union (B-A)
, выпридется использовать:
var sequenceDiff =
sequenceA.Except( sequenceB ).Union( sequenceB.Except( sequenceA ) );
Если у вас сложный тип, вы можете написать IComparer<T>
для вашего типа T и использовать перегрузку, которая принимает компаратор.
Для второгоЧасть вашего вопроса, вам нужно будет свернуть свою собственную реализацию, чтобы сообщить, какие свойства типа отличаются .. нет ничего встроенного в .NET BCL напрямую.Вы должны решить, какую форму примет эта отчетность?Как бы вы определили и выразили различия в сложном типе?Вы, конечно, можете использовать рефлексию для этого ... но если вы имеете дело только с одним типом, я бы этого избегал и написал бы специально для него разностную утилиту.Если вы собираетесь поддерживать диапазон типов borad, тогда рефлексия может иметь больше смысла.