LINQ with ObservableCollection

本文关键字:ObservableCollection with LINQ | 更新日期: 2023-09-27 17:58:41

我有一个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属性。

LINQ with 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接口通知更改。