c# - 我如何根据每个元素的条件循环可观察序列?

标签 c# while-loop system.reactive observablecollection observable

我有一个序列,我需要根据每个元素的条件重复它。例如,如果某个元素标有“失败”标志,我需要对其进行重新处理。我的问题是我找不到如何执行 while-loop 操作。

TakeWhile 几乎是我所需要的,但它不会 self 重复。

/*
* The following lines are just an example to comprehend the idea
*/
var observableSequence = sequence.ToObservable();
observableSequence
    //This ´DoWhile´ did not worked because does not accept each element as argument
    //and sequence at this point is not the same as `observableSequence`
    .DoWhile(() => sequence.Any(item => !item.Failed))
    .Where(item => item.Failed == true) //OK here i could put another condition for limited retries...
    .Subscribe(item => {
        try{
            //Do stuff...
            //. . .
            item.Failed = false;
        } catch
        {
            item.Failed = true;
        }
    });

最佳答案

我建议将原始序列与一个新的 Observable 合并,当对象失败时将其输入。

var retries = new ReplaySubject<Foo>();
var loopSequence = sequence.ToObservable().Merge(retries);

loopSequence
    .Where(item => item.Failed)
    .Subscribe(item =>
    {
        try{
            //Do stuff
            item.Failed = false;
        } catch
        {
            item.Failed = true;
        }
        retries.OnNext(item);
    });

通常认为更改可观察对象中对象的状态是不好的做法,因此您可能需要考虑创建转换:

loopSequence
    .Where(item => item.Failed)
    .Subscribe(item =>
    {
        try{
            //Do stuff
            retries.OnNext(new Item { ..., Failed = false });
        } catch
        {
            retries.OnNext(new Item { ..., Failed = true });
        }
    });

您还应该非常小心这种模式,因为持续失败的项目会使您的程序执行进入一种无限循环。

关于c# - 我如何根据每个元素的条件循环可观察序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37081111/

相关文章:

php - 数组输出 - 索引结构中的顺序

使用 WHILE 循环的直角三角形 C++ 代码

c# - 如何在不引入竞争条件的情况下等待 RX Subject 的响应?

c# - 无效异步方法的断言

c# - 从 WCF 客户端内部调试 NullReference 异常

java while 循环计数不正确

c# - Reactive Extensions 吞下在线程池线程上调用的 OnNext() 的异常?

c# - 表单例份验证超时后重定向到页面

c# - 从 DTE (EnvDte) 获取进程 ID

c# - 实现 Rx 处理程序的最佳实践是什么?