加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 集合上的观察者

发布时间:2020-12-15 08:11:07 所属栏目:百科 来源:网络整理
导读:我正在使用.net 4上的Rx框架中的第一步. 我正在尝试观察像List int这样的集合.或字典 x,x. 当一个项目被添加到集合时,它将在控制台中将其写入ToString(). 有任何想法吗 ?或一些代码示例 谢谢 解决方法 列表与LT; T和词典 TKey,TValue是不可观察的(当他们改
我正在使用.net 4上的Rx框架中的第一步.
我正在尝试观察像List< int>这样的集合.或字典< x,x>.
当一个项目被添加到集合时,它将在控制台中将其写入ToString().

有任何想法吗 ?或一些代码示例
谢谢

解决方法

列表与LT; T>和词典< TKey,TValue>是不可观察的(当他们改变时他们不会引发事件),所以Rx没有任何东西可以挂钩.

对于List,您可以使用ObservableCollection<T>,但是您需要将其事件包装起来以便从Rx中使用它.以下是使用扩展方法的示例:

public static class ObservableCollectionExtensions
{
    public static IObservable<IEvent<NotifyCollectionChangedEventArgs>> 
        GetObservableChanges<T>(this ObservableCollection<T> collection)
    {
        return Observable.FromEvent<
            NotifyCollectionChangedEventHandler,NotifyCollectionChangedArgs>(
                h => new NotifyCollectionChangedEventHandler(h),h => collection.CollectionChanged += h,h => collection.CollectionChanged -= h
            );
    }

    public static IObservable<T> GetObservableAddedValues<T>(
        this ObservableCollection<T> collection)
    {
        return collection.GetObservableChanges()
            .Where(evnt => evnt.EventArgs.Action == NotifyCollectionChangedAction.Add)
            .SelectMany(evnt => evnt.EventArgs.NewItems.Cast<T>());
    }
}

我已经包含了一个额外的帮助程序,它只将新添加的项目公开为IObservable< T>,您可以像这样使用:

ObservableCollection<int> collection = 
    new ObservableCollection<int>(new int[] { 1,2,3 });

collection.GetObservableAddedValues().Subscribe(
    i => Console.WriteLine("{0} was added",i)
);

框架中没有可观察到的词典,尽管ObservableDictionary codeplex project似乎填补了这个空白,我确信它可以以类似的方式包装.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读