-4

例如:

我有最小值和最大值以及一些可能是奇数或偶数的增量;

如果我有 min = 3 和 max = 10 并且增量 = 15 那么我想要:

3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3

但是,如果增量 = 16 我想要(注意中间的两个 10):

3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3

我必须只使用最小、最大和增量数来创建这些数组。

更新:

为了使这一点更清楚,增量的数量等于必须在数组中的项目数,并且这些项目是小数。

所以如果 min = 5.0 和 max = 15.0 并且增量 = 6 那么数组将包含:

5.0, 10.0, 15.0, 15.0, 10.0, 5.0
4

3 回答 3

1

这应该有效:

public static IEnumerable<decimal> NewMethod(decimal min, decimal max, int count)
{
    var increment = (max - min) / (int)((count - 1) / 2);

    for (var i = min; i < max; i += increment)
        yield return i;

    if (count % 2 == 0)
        yield return max;

    for (var i = max; i >= min ; i -= increment)
        yield return i;
}

样品测试:

var min = 3.0m;
var max = 10.0m;
var count = 16;

MessageBox.Show(string.Join(", ", NewMethod(min, max, count)));

编辑:您必须处理失去精度的浮点类型,否则您将在最终结果集中丢失一个元素。稍微修改一下Math.Roundi +=部分i -=,这取决于你。我已更新代码以替换double为更可靠的decimal类型。但不能保证每次都不会失败。更容易避免在结果中需要小数类型的情况,例如{ 1, 2.2, 3.4 }等。

于 2013-05-15T18:37:43.840 回答
1

林克方式:

int min = 3;
int max = 10;
int increments = 15;

Enumerable
    .Range(min, max - min + 1)
    .Concat(Enumerable
        .Range(min, max - min + 1)
        .Reverse()
        .Skip(increments % 2))
    .ToArray();
于 2013-05-15T16:36:30.377 回答
0

这是一个正确处理浮点值的单向斜坡。您应该能够对其进行修改以制作三角波形。在实现斜坡时,必须注意确保不累积舍入误差或各种输入的逐一误差。

void Packet::SetRamp( const SampleType start /*= Signal::One*/,
                      const SampleType finish /*= -Signal::One */ )
{
    SampleType slope, current;
    SampleOffsetType len;
    len = GetLength();
    if ( len < 2 )
        throw std::range_error( "packet is not large enough to set ramp into" );
    slope = ( finish - start ) / ( len - 1 );
    for ( SampleOffsetType row = 0; row < len; row++ )
    {
        current = slope * row + start;
        SetSample( row, current );
    }
}
于 2015-09-03T01:08:44.783 回答