【问题标题】:How do I create an array of ascending and then descending numbers?如何创建一个升序然后降序数字的数组?
【发布时间】:2013-05-10 08:06:18
【问题描述】:

例如:

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

如果我有 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

【问题讨论】:

  • 您可以使用 LINQ 还是应该“手动”执行此操作?
  • 这是你的功课吗?
  • @Yuck: Linq 可以使用
  • min = 3 和 max = 10 和增量 = 20 的输出是什么
  • 我想问题是这样的。最小,最大,增量输入必须是这样的,这样你就可以循环回到最小值,如果让你达到最大值的计数超过一半,则不重复最大值,否则就是这样。因此某些组合或 min、max、incr 无效,例如 3、10、20。但谁知道呢,我们只能猜测!

标签: c# arrays


【解决方案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();

【讨论】:

  • 嗨,我已经更新了问题给出的信息,试图让问题更清楚
【解决方案2】:

这应该可行:

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

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

【讨论】:

  • 请给我一个示例集。我的意思是最小值和最大值是多少?
  • 只需将计数更改为 7 或 8,其他一切都保持不变
  • @descf 你遇到了精度错误,浮点运算必然会发生。你真的想要小数值吗?首先避免它们更容易,更安全。我会更新我的答案。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 2021-12-22
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多