Соедините 2 таблицы, предположительно A LEFT JOIN B
. Вы можете использовать оператор CASE
в своем SELECT
, чтобы проверить, доступна ли информация в таблице B, ELSE
взять из таблицы A
.
Если вы напишите более подробный вопрос, я могу написать более подробный ответ.
.... но как делают мы находим, что эквивалентный класс во втором Списке передает методу ниже;
Это - Ваша фактическая проблема; у Вас должно быть по крайней мере одно неизменное свойство, идентификатор или что-то как этот, для идентификации соответствующих объектов в обоих списках. Если у Вас нет такого свойства Вами, не может решить проблему без ошибок. Можно просто попытаться предположить соответствующие объекты путем поиска минимальных или логических изменений.
Если у Вас есть такое свойство, решение становится действительно простым.
Enumerable.Join(
listA, listB,
a => a.Id, b => b.Id,
(a, b) => CompareTwoClass_ReturnDifferences(a, b))
благодаря Вам обоим danbruc и Noldorin для Вашей обратной связи. оба Списка будут той же длиной и в том же порядке. таким образом, метод выше близок, но можете Вы изменять этот метод для передачи перечисления. Текущий к методу я отправил выше?
Теперь я смущен..., какова проблема с этим? Почему не только следующее?
for (Int32 i = 0; i < Math.Min(listA.Count, listB.Count); i++)
{
yield return CompareTwoClass_ReturnDifferences(listA[i], listB[i]);
}
Математика. Минута () вызов может даже быть не учтен, если равная длина гарантируется.
Реализация Noldorin, конечно, более умна из-за делегата и использования перечислителей вместо того, чтобы использовать ICollection.
Я думаю, что Вы ищете метод как это:
public static IEnumerable<TResult> CompareSequences<T1, T2, TResult>(IEnumerable<T1> seq1,
IEnumerable<T2> seq2, Func<T1, T2, TResult> comparer)
{
var enum1 = seq1.GetEnumerator();
var enum2 = seq2.GetEnumerator();
while (enum1.MoveNext() && enum2.MoveNext())
{
yield return comparer(enum1.Current, enum2.Current);
}
}
Это не тестируется, но это должно сделать задание, тем не менее. Обратите внимание, что то, что особенно полезно об этом методе, - то, что это - полный дженерик, т.е. может потребоваться две последовательности произвольных (и отличающийся) типы и эхо-сигналы любого типа.
Это решение, конечно, предполагает, что Вы хотите сравнить энный объект seq1
с энным объектом в seq2
. Если Вы хотите сделать, соответствуют элементам в двух последовательностях на основе особого свойства/сравнения, то Вы захотите выполнить своего рода операцию соединения (как предложено использованием danbruc Enumerable.Join
. Действительно сообщите мне, если это, ни один из этих подходов не вполне, что я после и возможно я могу предложить что-то еще.
Править: Вот пример того, как Вы могли бы использовать CompareSequences
метод с функцией компаратора Вы первоначально отправили.
// Prints out to the console all the results returned by the comparer function (CompareTwoClass_ReturnDifferences in this case).
var results = CompareSequences(list1, list2, CompareTwoClass_ReturnDifferences);
int index;
foreach(var element in results)
{
Console.WriteLine("{0:#000} {1}", index++, element.ToString());
}
Я надеюсь, что я - understing Ваш вопрос правильно, но можно сделать это очень быстро с Linq. Я предполагаю, что универсально у Вас всегда будет свойство Id. Просто создайте интерфейс для обеспечения этого.
Если, как Вы определяете объект быть теми же изменениями от класса до класса, я рекомендовал бы передать в делегате, который возвращает true, если два объекта имеют тот же персистентный идентификатор.
Вот то, как сделать это в Linq:
List<Employee> listA = new List<Employee>();
List<Employee> listB = new List<Employee>();
listA.Add(new Employee() { Id = 1, Name = "Bill" });
listA.Add(new Employee() { Id = 2, Name = "Ted" });
listB.Add(new Employee() { Id = 1, Name = "Bill Sr." });
listB.Add(new Employee() { Id = 3, Name = "Jim" });
var identicalQuery = from employeeA in listA
join employeeB in listB on employeeA.Id equals employeeB.Id
select new { EmployeeA = employeeA, EmployeeB = employeeB };
foreach (var queryResult in identicalQuery)
{
Console.WriteLine(queryResult.EmployeeA.Name);
Console.WriteLine(queryResult.EmployeeB.Name);
}