比较2个集合,得到Modified项目

本文关键字:Modified 项目 得到 2个 集合 比较 | 更新日期: 2023-09-27 18:14:14

我的应用程序中有两个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();

比较2个集合,得到Modified项目

如果这两个列表包含相同的对象实例,那么它将无法工作,因为一个列表中对象属性的更改也将应用于另一个列表(因为它们是相同的实例)。

这意味着你必须:

  1. 在更改对象之前克隆对象,或者
  2. 在每次更改时创建一个新实例。

如果它们不是相同的实例(例如,如果它们是克隆的或通过数据库循环),那么您需要为运行时提供一种方法来比较单个属性。

您可以覆盖StoreSettingsEquals方法,或者为您的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();

这应该会让您得到更改

               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;
                });