• Reactive Extension


    目录:

    1、Timer:设定Obervable执行时间间隔。

    2、Enumerable to Observable转换

    3、Observable to Enumerable 转换

    4、zip 匹配的两个序列合并操作,返回一个合并后的值

    5、Buffer 缓存集合

    6、TimeOut 超出预订时间,取消订阅事件。当超出时间后可以Catch这个异常。

    7、Merge 合并两个Observable

    8、CombineLatest 最近输入的两个数字相比较

    9、Publish 共享订阅事件

    10、Interval 订阅事件的时间间隔

    11、Group 分组

    1、Timer:设定Obervable执行时间间隔。

    Subscrible 订阅事件,Dispose 取消订阅的事件。Timer的前一个参数是开始时间,第二个是 时间间隔。

                var observable = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1))
                    .Where(x => x % 2 == 0).Select(x => new { First = x, Second = x * x });
                var disposable = observable.Subscribe(a => Console.WriteLine("Value is {0} double Value is {1}", a.First, a.Second), () => Console.WriteLine("Completed"));
    
                Console.ReadLine();
                disposable.Dispose();

    结果

    image

    2、Enumerable to Observable转换

    IEnumerable<char> c = "abc";
                IObservable<char> observable = c.ToObservable();
                observable.Subscribe(x => Console.WriteLine(x),()=>Console.WriteLine("Completed"));

    image

    3、Observable to Enumerable 转换

    IObservable<long> observable = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
                var enumerable = observable.ToEnumerable();
                foreach (var l in enumerable)
                {
                    Console.WriteLine(l);
                }

    image

    4、zip 匹配的两个序列合并操作,返回一个合并后的值

     IObservable<int> observable1 = new int[] { 1, 2, 3 }.ToObservable();
                IObservable<int> observable2 = new int[] { 5, 3, 8, 4 }.ToObservable();
                var zip = observable1.Zip(observable2, (x1, x2) => x1 * x2);
                zip.Subscribe(x => Console.WriteLine(x));

    image

    5、Buffer 缓存集合

    当我集合不断在增加的时候,我需要在增加到一定数量,才执行操作。如下:每过3秒 输出一次结果。

    IObservable<long> observable = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
                var buffer = observable.Buffer(TimeSpan.FromSeconds(3));
                buffer.Subscribe(x =>
                                     {
                                         Console.WriteLine("after 3 second");
                                         foreach (var l in x)
                                         {
                                             Console.WriteLine("value is {0}", l);
                                         }
                                     });

    image

    6、TimeOut 超出预订时间,取消订阅事件。当超出时间后可以Catch这个异常。

     IObservable<long> sequence = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
                sequence = sequence.Buffer(3).SelectMany(values => values);
                sequence = sequence.Timeout(TimeSpan.FromSeconds(2));
                IDisposable subscription = sequence.Subscribe(value => Console.WriteLine("Value produced is {0}", value));

    这里TimeOut设置了2秒,而Buffer是3秒,也就是要3秒后输出结果,但这时的3秒超出了我们设定的TimeOut,也就取消了这个订阅事件

    ,什么都不会输出。我们捕获这个异常。

     IObservable<long> sequence = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
                sequence = sequence.Buffer(3).SelectMany(values => values);
                sequence = sequence.Timeout(TimeSpan.FromSeconds(2));
                IDisposable subscription = sequence.Subscribe(value => Console.WriteLine("Value produced is {0}", value),
            error => Console.WriteLine("Error occurred [{0}]", error.Message));

    image

    对这个异常做处理。

    IObservable<long> sequence = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
                sequence = sequence.Buffer(3).SelectMany(values => values);
                sequence = sequence.Timeout(TimeSpan.FromSeconds(2)).Catch(new long[] { 1, 3, 5 }.ToObservable());
                IDisposable subscription = sequence.Subscribe(value => Console.WriteLine("Value produced is {0}", value),
                    () => Console.WriteLine("Sequence completed normally"));

    image

    7、Merge 合并两个Observable

     IObservable<int> observable1 = new int[] { 1, 2, 3 }.ToObservable();
                IObservable<int> observable2 = new int[] { 5, 3, 8, 4 }.ToObservable();
                observable1.Merge(observable2).Subscribe(x=>Console.WriteLine(x));

    image

    8、CombineLatest 最近输入的两个数字相比较

     IObservable<int> observable1 = new int[] { 1, 2, 3 }.ToObservable();
                IObservable<int> observable2 = new int[] { 5, 3, 8, 4 }.ToObservable();
                var combineLatest = observable1.CombineLatest(observable2, (x1, x2) => x1 + x2).Subscribe(x=>Console.WriteLine(x));

    A和B的序列,任何一边在引发变化时都会取出两边最新的值输出。

    image

    9、Publish 共享订阅事件

     var unshared = Observable.Range(1, 4);
    
                // Each subscription starts a new sequence
                unshared.Subscribe(i => Console.WriteLine("Unshared Subscription #1: " + i));
                unshared.Subscribe(i => Console.WriteLine("Unshared Subscription #2: " + i));
    
                Console.WriteLine();
    
                // By using publish the subscriptions are shared, but the sequence doesn't start until Connect() is called.
                var shared = unshared.Publish();
                shared.Subscribe(i => Console.WriteLine("Shared Subscription #1: " + i));
                shared.Subscribe(i => Console.WriteLine("Shared Subscription #2: " + i));
                shared.Connect();

    image

    10、Interval 订阅事件的时间间隔

     var observable = Observable.Interval(TimeSpan.FromMilliseconds(750)).TimeInterval();
                observable.Subscribe(x=>Console.WriteLine(x));

    image

    Timestamp 可以输出精确到秒后面7位数。

       var observable = Observable.Interval(TimeSpan.FromMilliseconds(750)).Timestamp();
                observable.Subscribe(x=>Console.WriteLine(x));

    image

    11、Group 分组

     var timeToStop = new ManualResetEvent(false);
                var keyPresses = KeyPresses().ToObservable();
                var groupedKeyPresses =
                    from k in keyPresses
                    group k by k.Key into keyPressGroup
                    select keyPressGroup;
                Console.WriteLine("Press Enter to stop.  Now bang that keyboard!");
                groupedKeyPresses.Subscribe(keyPressGroup =>
                {
                    int numberPresses = 0;
                    keyPressGroup.Subscribe(keyPress =>
                    {
                        Console.WriteLine(
                            "You pressed the {0} key {1} time(s)!",
                            keyPress.Key,
                            ++numberPresses);
                    },
                    () => timeToStop.Set());
                });
                timeToStop.WaitOne();
     static IEnumerable<ConsoleKeyInfo> KeyPresses()
            {
                for (; ; )
                {
                    var currentKey = Console.ReadKey(true);
    
                    if (currentKey.Key == ConsoleKey.Enter)
                        yield break;
                    else
                        yield return currentKey;
                }
            }

    image


    作者:dingli
    出处:http://www.cnblogs.com/dingli/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Android中手机录屏并转换GIF的两种方式
    Android中访问sdcard路径的几种方式
    Android中开发工具Android Studio修改created用户(windows环境)
    [UOJ211][UER #6]逃跑
    [CF1168D]Anagram Paths
    [CF852H]Bob and stages
    Codechef BINOMSUM
    [ZJOI2019]开关
    [CF1161F]Zigzag Game
    [CF1149E]Election Promises
  • 原文地址:https://www.cnblogs.com/dingli/p/2536968.html
Copyright © 2020-2023  润新知