Сравните два Списка для различий

Соедините 2 таблицы, предположительно A LEFT JOIN B. Вы можете использовать оператор CASE в своем SELECT, чтобы проверить, доступна ли информация в таблице B, ELSE взять из таблицы A.

Если вы напишите более подробный вопрос, я могу написать более подробный ответ.

44
задан abatishchev 7 December 2011 в 13:00
поделиться

3 ответа

.... но как делают мы находим, что эквивалентный класс во втором Списке передает методу ниже;

Это - Ваша фактическая проблема; у Вас должно быть по крайней мере одно неизменное свойство, идентификатор или что-то как этот, для идентификации соответствующих объектов в обоих списках. Если у Вас нет такого свойства Вами, не может решить проблему без ошибок. Можно просто попытаться предположить соответствующие объекты путем поиска минимальных или логических изменений.

Если у Вас есть такое свойство, решение становится действительно простым.

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.

15
ответ дан Joshua 26 November 2019 в 21:57
поделиться

Я думаю, что Вы ищете метод как это:

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());
}
6
ответ дан Noldorin 26 November 2019 в 21:57
поделиться

Я надеюсь, что я - 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);
        }
1
ответ дан 26 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: