Сравнить 2 коллекции и получить измененные предметы

Вопрос:

У меня есть два ObservableCollection в моем приложении, которые содержат элементы типа StoreSettings именем “oldSettings” в коллекции, названной “_stores”.

 public ObservableCollection<StoreSettings> oldSettings;
private ObservableCollection<StoreSettings> _stores;

Вот мой класс StoreSettings

 public class StoreSettings :INotifyPropertyChanged
{
private bool _autoAOD;

public bool AutoAOD
{
get { return _autoAOD; }
set { _autoAOD = value;
}

private bool _autoGRN;

public bool AutoGRN
{
get { return _autoGRN; }
set { _autoGRN = value;
}

private bool _directPurchase;

public bool DirectPurchase
{
get { return _directPurchase; }
set { _directPurchase = value;
}
private decimal _gustoreID;

public decimal GUStoreID
{
get { return _gustoreID; }
set { _gustoreID = value;
}
private string _storeCode;

public string Storecode
{
get { return _storeCode; }
set { _storeCode = value;
}

Я обновляю некоторые свойства элемента через свое приложение, как я могу найти измененные элементы через linq?

это то, что я пробовал, но он всегда дает счету “0”,

  List<StoreSettings> result = _vmStoreconfig.oldSettings.Except(_vmStoreconfig.Stores).ToList();

Лучший ответ:

Если эти два списка содержат одни и те же экземпляры объектов, то это не будет работать, так как изменения в свойствах объекта в одном списке также будут применены и к другому списку (поскольку они являются одинаковыми экземплярами).

Это означает, что вам необходимо:

  1. клонировать объекты перед их заменой или
  2. создайте новый экземпляр при каждом изменении.

Если они не являются одинаковыми экземплярами (т.е. Если они клонированы или попадают в круглый круг базы данных), вам необходимо предоставить способ для среды выполнения сравнить отдельные свойства.

Вы можете либо переопределить метод Equals StoreSettings, либо использовать собственный StoreSettings для вашего класса StoreSettings.

Что-то вроде:

public class StoreSettingsEqualityComparer : IEqualityComparer<StoreSettings>
{
    public bool Equals(StoreSettings x, StoreSettings y)
    {
        if (object.ReferenceEquals(x, null))
            return object.ReferenceEquals(y, null);

        return
            x.AutoAOD == y.AutoAOD &&
            x.AutoGRN == y.AutoGRN &&  
            ...
    }

    public int GetHashCode(StoreSettings obj)
    {
        unchecked
        {
            var h = 31;
            h = h * 7 + obj.AutoAOD.GetHashCode();
            ...
            return h;
        }
    }
}

А затем используйте перегрузку Enumerable.Except которая принимает пользовательский сопоставитель:

var comparer = new StoreSettingsEqualityComparer();
var results = first.Except(second, comparer).ToList();

Ответ №1

Это должно дать вам изменения

               List<StoreSettings> changes = _vmStoreconfig.oldSettings.FindAll(delegate(StoreSettings item1)
{
StoreSettings found = _vmStoreconfig.Stores.Find(delegate(StoreSettings item2) {
// Specify comparisons between properties here
return item2.propertyA == item1.propertyA ...;
}
return found != null;
});

Оцените статью
TechArks.Ru
Добавить комментарий