在Rx

时间:2016-08-04 09:06:32

标签: c# .net system.reactive reactive-programming

我想将以下实现清理成更具说明性的方法,希望有一个我错过的Rx运算符。

我在流上发布了一系列数据,如下所示:

var data = new[] { 'A', 'A', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'C' };

我想将数据中的项目分组到一个数组中,直到更改为止,所以结果将是:

var result = new[] { { 'A', 'A' },  {'C' }, { 'A', 'A', 'A', 'A' }, { 'B' }, { 'C', 'C' } };

我有以下内容,我想要清理“选择”。实现。理想情况下使用Rx运算符(例如GroupByUntil)。

如何改进?

 Observable.Return(data)
           .Select(items =>
           {
               var groupedItems = new List<List<char>>();

               var currentItems = new List<char>();
               var previousItem = items.FirstOrDefault();
               foreach (var currentItem in items)
               {
                   if (previousItem != currentItem)
                   {
                       groupedItems.Add(currentItems);
                        currentItems = new List<char>();
                   }

                   currentItems.Add(currentItem);
                   previousItem = currentItem;
               }
                groupedItems.Add(currentItems);
                return (IEnumerable<IEnumerable<char>>)groupedItems;
            })
            .Subscribe(groupedItems =>
            {
               foreach (var groupedItem in groupedItems)
               {
                   Console.WriteLine("{0} - {1}", groupedItem.First(), groupedItem.Count());
               }
            });

1 个答案:

答案 0 :(得分:3)

当输入流转换为.ToObservable的字符流时。以下实现是可能的:

    var data = new[] { 'A', 'A', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'C' };

    var publishedData = data
        .ToObservable()
        .Publish()
        .RefCount();

    publishedData
        .GroupByUntil(e => e, e => e, g => publishedData.Where(i => i != g.Key))
        .Select(g => g.ToArray())
        .Merge()
        .Subscribe(groupedItems =>
        {
            Console.WriteLine("{0} - {1}", groupedItems.First(), groupedItems.Count());
        });

.Publish().RefCount()运算符中的结束序列需要.GroupByUntil