以零为中心的分工

时间:2011-01-05 00:50:23

标签: c# linq

我正在尝试创建类似直方图的东西。我正在尝试从数组创建存储桶。

假设我有一个随机数组,在-10到10之间加倍;这非常简单。然后我想指定一个中心点,在这种情况下为0和桶的数量。

如果我想要4个桶,则除法将为-10到-5,-5到0,0到5和5到10.不那么复杂吧。现在,如果我将min和max更改为-12和-9,而对于4个分区则更复杂。我想要在-3和3分区;它以0为中心;或者一个在-6到0和0到6之间。

找到分区大小并不难。

= Math.Ceiling((Abs(Max) + Abs(Min)) / Divisions)

然后你基本上会有一个if语句来确定你是希望它以0还是边缘为中心。然后根据情况从0或DivisionSize / 2迭代。你可能不会总是得到指定的分割数,但它会很接近。然后迭代遍历数组并增加bin计数。

这看起来像是一个好方法吗?这种方法肯定会起作用,但它似乎并不是最优雅的。我很好奇是否能够以更优雅的方式在linq的聪明课程中创建垃圾箱和列表中的计数?

创建垃圾箱然后让每个垃圾箱成为属性{get;} returns list.Count(x=> x >= Lower && x < Upper).

1 个答案:

答案 0 :(得分:0)

对我来说似乎更简单:你需要找到每个“分区”的下限和大小。 因为你希望它在0左右对称,这取决于分割的数量,你得到一个包括0表示奇数(-3,3)或0表示偶数(-3,0)(0,3)

lowerBound = - Max(Abs(from),Abs(to))

bucketSize = 2 * lowerBound / division

(抛出天花板并根据需要更新bucketSize和lowerBound)

比使用.Aggregate来更新存储区数组(位置将是(value-lowerBound)/ devisions,如果需要还需要进行额外的范围检查。)

注意:不要按照你建议的方式实现 - 不应该让getter执行非常重要的工作,比如走大阵列。