我有一个ObservableCollection属性,需要使用LINQ进行操作。
我想做的是获取第一个集合,并根据项的属性从另一个集合中删除项。
这就是我目前所拥有的:
ItemsObservableCollection = ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name);
如果我这样做,我会得到一个强制转换错误,说我不能将IEnumerable强制转换为ObservableCollection。如果我把值保存到var中,它会做我想要的事情:
var collectionItems= ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name);
但我需要它来更新ObservableCollection属性。
好吧,您有一个ObservableCollection ctor,它接受IEnumerable<T>
所以你可以做
ItemsObservablecollection = new ObservableCollection<DesiredType>(ItemsObservableCollection.Where(i=>!selectedItemsObservableCollection.Any(y=> y.name == i.Name));
您可以从原始集合中删除所需的项,而不是创建新集合。例如,如果您在WPF中工作,并且已将可观察集合绑定到控件,那么这是更可取的。
var itemsToRemove = ItemsObservableCollection.Where(
i => !selectedItemsObservableCollection.Any(y => y.name == i.Name)).ToList();
foreach (var item in itemsToRemove)
ItemsObservableCollection.Remove(item);
(必须使用ToList()
以避免"集合已修改"错误。)
您需要我的ObservableComputations库。就是这样。NET API,用于INotifyPropertyChanged和INotifyCollectionChanged(ObservableCollection)对象上的计算。计算结果是INotifyPropertyChanged和INotifyColectionChanged(ObservableCollection)对象。
使用这个库,你可以这样编码:
var collectionItems= ItemsObservableCollection.Filtering(i=>
!selectedItemsObservableCollection.AnyComputing(y => y.name == i.Name).Value);
collectionItems是ObservableCollection,反映ItemsObservableCollectioncollection和Name属性中的所有更改。确保上面代码中提到的所有属性都通过INotifyPropertyChanged接口通知更改。