例如:
我有最小值和最大值以及许多可能是奇数或偶数的增量;
如果我有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
答案 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.Round
和i +=
部分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 );
}
}