如何创建升序数字然后降序数字?

时间:2013-05-15 16:27:59

标签: c# arrays

例如:

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

如果我有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,max和number of increment来创建这些数组add-hoc。

更新:

为了更清楚,增量的数量等于数组中必须包含的项目数,且项目是小数。

因此,如果min = 5.0且max = 15.0且incrementments = 6,则数组将包含:

5.0, 10.0, 15.0, 15.0, 10.0, 5.0

3 个答案:

答案 0 :(得分:1)

Linq方式:

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();

答案 1 :(得分: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 }等结果中需要小数类型的情况。

答案 2 :(得分: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 );
    }
}