Проверка двух списков на Модификации - PullRequest
3 голосов
/ 15 сентября 2011

У меня есть два списка двух разных типов , которые имеют следующие общие свойства.

Id -> используется для идентификации соответствующих объектов

Bunch of other Properties

ModificationDate

Необходимо сравнить эти два списка на основе даты Модификации. Если дата модификации отличается (первый список ModificationDate больше, чем ModificationDate второго списка, то скопируйте все свойства, если этот элемент из первого списка во второй.

Пожалуйста, дайте мне знать, как это сделать.

РЕДАКТИРОВАНИЕ: Второй список может содержать или не содержать все элементы первого и наоборот. Мой первый список всегда является исходным списком. поэтому, если элемент присутствует в списке 1 и отсутствует в списке 2, нам нужно добавить его в список 2. Также, если элемент присутствует в списке 2, но отсутствует в списке 1, удалите его из списка 2.

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

Поиск добавленных / удаленных элементов

var list1 = new List<MyType>();
var list2 = new List<MyType>();

// These two assume MyType : IEquatable<MyType>
var added = list1.Except(list2);
var deleted = list2.Except(list1);

// Now add "added" to list2, remove "deleted" from list2

Если MyType не реализует IEquatable<MyType> или реализация не основана исключительно на сравнении идентификаторов, вам нужно будет создать IEqualityComparer<MyType>:

class MyTypeIdComparer : IEqualityComparer<MyType>
{
    public bool Equals(MyType x, MyType y)
    {
        return x.Id.CompareTo(y.Id);
    }

    public int GetHashCode(MyType obj)
    {
        return obj.Id.GetHashCode();
    }
}

Что позволит вам:

// This does not assume so much for MyType
var comparer = new MyTypeIdComparer();
var added = list1.Except(list2, comparer);
var deleted = list2.Except(list1, comparer);

Поиск модифицированных предметов

var modified = list1.Concat(list2)
                    .GroupBy(item => item.Id)
                    .Where(g => g.Select(item => item.ModificationDate)
                                 .Distinct().Count() != 1);

// To propagate the modifications:
foreach(var grp in modified) {
    var items = grp.OrderBy(item => item.ModificationDate);
    var target = items.First(); // earliest modification date = old
    var source = grp.Last();    // latest modification date = new

    // And now copy properties from source to target
}
1 голос
/ 15 сентября 2011

Это может помочь. В библиотеке Linq есть много полезных функций, таких как Except, Intersection.

http://msdn.microsoft.com/en-us/library/bb397894.aspx

0 голосов
/ 20 сентября 2011

Предоставленная ссылка была полезна при сравнении двух списков разных типов

Сравнение коллекций в .Net

...