我想填充一个集合,直到满足这两个条件中的任何一个:
- 允许的 5 秒时间已完成,或者
- 收藏达到 5 件。
如果满足这些条件中的任何一个,则应执行我订阅的方法(在本例中为 Console.WriteLine)
static void Main(string[] args)
{
var sourceCollection = Source().ToObservable();
var bufferedCollection = sourceCollection.Buffer(
() => Observable.Amb(
Observable.Timer(TimeSpan.FromSeconds(5)//,
//Observable.TakeWhile(bufferedCollection, a=> a.Count < 5)
))
);
bufferedCollection.Subscribe(col =>
{
Console.WriteLine("count of items is now {0}", col.Count);
});
Console.ReadLine();
}
static IEnumerable<int> Source()
{
var random = new Random();
var lst = new List<int> { 1,2,3,4,5 };
while(true)
{
yield return lst[random.Next(lst.Count)];
Thread.Sleep(random.Next(0, 1500));
}
}
我设法让它与 Observable.timer 一起使用,但 TakeWhile 不起作用,我如何检查集合计数,TakeWhile 是否适用于此或有其他方法?我确定这很简单。
我明白了,答案在 Buffer 的文档中 - 有一个重载,它采用指定最大计数的参数。所以我不需要Observable.Amb
,我可以说
var sourceCollection = Source().ToObservable();
var maxBufferCount = 5;
var bufferedCollection = sourceCollection.Buffer(TimeSpan.FromSeconds(5), maxBufferCount, Scheduler.Default);
bufferedCollection.Subscribe(col =>
{
Console.WriteLine("count of items is now {0}", col.Count);
});
Console.ReadLine();