Мне хотелось бы получить некоторые отзывы о том, как лучше всего написать общую функцию, которая позволит сравнивать два списка. Списки содержат объекты класса, и мы хотели бы перебирать один список, ища тот же элемент во втором списке и сообщать о любых различиях.
У нас уже есть метод для сравнения классов, поэтому нам нужна обратная связь о том, как мы можем подать метод (показано ниже) из двух списков.
Например, скажем, у нас есть простой класс "Сотрудник", который имеет три свойства: имя, идентификатор, отдел. Мы хотим сообщить о различиях между списком и другим списком.
Примечание:
Оба списка всегда будут содержать одинаковое количество элементов.
Как уже упоминалось выше, у нас есть общий метод, который мы используем для сравнения двух классов, как мы можем включить этот метод для обслуживания списков, т.е. из другого метода, перебирать список и комбинировать классы с общим методом... но как мы можем найти эквивалентный класс во втором списке, чтобы перейти к следующему методу:
public static string CompareTwoClass_ReturnDifferences<T1, T2>(T1 Orig, T2 Dest)
where T1 : class
where T2 : class
{
// Instantiate if necessary
if (Dest == null) throw new ArgumentNullException("Dest", "Destination class must first be instantiated.");
var Differences = CoreFormat.StringNoCharacters;
// Loop through each property in the destination
foreach (var DestProp in Dest.GetType().GetProperties())
{
// Find the matching property in the Orig class and compare
foreach (var OrigProp in Orig.GetType().GetProperties())
{
if (OrigProp.Name != DestProp.Name || OrigProp.PropertyType != DestProp.PropertyType) continue;
if (OrigProp.GetValue(Orig, null).ToString() != DestProp.GetValue(Dest, null).ToString())
Differences = Differences == CoreFormat.StringNoCharacters
? string.Format("{0}: {1} -> {2}", OrigProp.Name,
OrigProp.GetValue(Orig, null),
DestProp.GetValue(Dest, null))
: string.Format("{0} {1}{2}: {3} -> {4}", Differences,
Environment.NewLine,
OrigProp.Name,
OrigProp.GetValue(Orig, null),
DestProp.GetValue(Dest, null));
}
}
return Differences;
}
Любые предложения или идеи оценены?
Изменить: Ориентация .NET 2.0, поэтому LINQ не может быть и речи.