RX LINQ分区输入流

时间:2014-04-23 06:09:54

标签: linq system.reactive

我有一个输入流,其中输入元素由Date,Depth和Area组成。 我想绘制区域对抗深度,并希望从中取出一个深度窗口,例如在1.0-100.0m之间。 问题是我想要对输入流进行下采样,因为可能有许多输入具有接近的深度值。 我想将输入分区为x个bin,例如2个箱意味着1-50之间的所有深度值在第一个箱中平均,51-100在第二个箱中平均。

我在想这样的事情:

var q = from e in input
         where (e.Depth > 1) && (e.Depth <= 100)
         // here I need some way of partition the sequence into bins
         // and averaging the elements.

Split a collection into `n` parts with LINQ?想要在没有rx的情况下做类似的事情。

2 个答案:

答案 0 :(得分:0)

根据您的评论修改回答。 steps =桶数。

var min = 1, max = 100;
var steps = 10;
var f = (max - min + 1) / steps; // The extra 1 is really an epsilon. #hack
var q = from e in input
        where e.Depth > 1 && e.depth <= 100
        let x = e.Depth - min
        group e by x < max ? (x - (x % f)) : ;

这是我们为给定的e.Depth分组的功能。

enter image description here

这可能不会因浮点值(由于精度)而变得如此之大,除非你对选择进行平铺/细化,但是你可能会用完整数,所以你可能需要缩放一点......像group e by Math.Floor((x - (x % f)) * scaleFactor)这样的东西。

答案 1 :(得分:0)

这应该做你想要的事情

static int GetBucket(double value, double min, double max, int bucketCount)
{
    return (int)((value - min) / (max - min) * bucketCount + 0.5);
}

var grouped = input.GroupBy(e => GetBucket(e.Depth, 1, 100, 50));