比较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();
如果这两个列表包含相同的对象实例,那么它将无法工作,因为一个列表中对象属性的更改也将应用于另一个列表(因为它们是相同的实例)。
这意味着你必须:
- 在更改对象之前克隆对象,或者
- 在每次更改时创建一个新实例。
如果它们不是相同的实例(例如,如果它们是克隆的或通过数据库循环),那么您需要为运行时提供一种方法来比较单个属性。
您可以覆盖StoreSettings
的Equals
方法,或者为您的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;
});