在满足某些条件之前选择n个最后一个元素

时间:2019-01-08 16:52:18

标签: c# system.interactive

在遇到某些条件之前,是否有任何专用的Interactive Extensions方法会生成最后n个元素?

例如,对于数组asyncio.Future,我想获得元素99加2个元素:

src
  

{{3,4,99},{6,7,99},{9,10,99}}

我已经看完下面的代码,但是想知道是否有专用的方法或方法的组合来完成此操作。

var src = new[] { 1, 2, 3, 4, 99, 5, 6, 7, 99, 8, 9, 10, 99 };

1 个答案:

答案 0 :(得分:1)

因此,我也对其他解决方案感到好奇,因此决定尝试使用它。我确实使用窗口提出了另一种解决方案:

var src = new[] { 1, 2, 3, 4, 99, 5, 6, 7, 99, 8, 9, 10, 99 };

var obs = src.ToObservable().Publish().RefCount();

var windows =
    obs
    .Zip(
        obs.Skip(2).Concat(Observable.Repeat(0, 2)),
        (chase, lead) => (chase, lead))
    .Publish(pub =>
        pub
        .Window(
            pub.Where(x => x.lead == 99),
            _ => pub.Skip(1)));

使用此解决方案,windows现在是IObservable<IObservale<int>>。大理石图看起来像这样(我希望这是有道理的,我正在研究代表可观察对象的最佳方法):

src: 1--2--3--4--99--5--6--7--99--8--9--10--99--
                   WINDOW QUERY
   : ------3--4--99-----------------------------
   : -------------------6--7--99----------------
   : --------------------------------9--10--99--

乍一看,其行为与您的解决方案相同,但经过反复试验后,我意识到当寡妇重叠时,其行为会大不相同。

如果您使用此src代替:

// Note the adjacent 99s.
var src = new[] { 1, 2, 3, 4, 99, 99, 6, 7, 99, 8, 9, 10, 99 }; 

您的解决方案会产生:

  

{{3,4,99},{4,99,99},{6,7,99},{9,10,99}}

虽然开窗解决方案会产生以下结果:

src: 1--2--3--4--99--99--6--7--99--8--9--10--99--
               WINDOW QUERY
   : ------3--4--99-----------------------------
   : ---------4--99--99-------------------------
   : -------------------6--7--99----------------
   : --------------------------------9--10--99--

在两个结果上都调用SelectMany之前,似乎没有什么不同。然后您的样子如下:

  

{3,4,99,4,99,99,6,7,99,9,10,99}

但是开窗解决方案交错了可观察对象(这很有意义):

  

{3,4,4,99,99,99,6,7,99,9,10,99}

使用Buffer解决方案时要考虑的一件事是,每个缓冲区都需要在返回缓冲区之前将其复制到新列表。因此,开窗解决方案在某些情况下可能会表现更好。我承认我不了解可观察变量以及可枚举变量的内部工作原理,因此必须进行一些测试才能确定。

无论如何,玩起来很有趣,根据最终目标的不同,这可能是一个可行的解决方案。