我想将以下实现清理成更具说明性的方法,希望有一个我错过的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());
}
});
答案 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
。