2013-05-15 38 views
-4

例如:如何创建一个升序和降序数组的数组?

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

如果我已经分钟= 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 

我必须使用最小值,最大值和增量数量创建这些数组add-hoc。

UPDATE:

为了说明清楚增量数等于项必须是阵列中的项目是小数的数。

因此,如果分= 5.0和max = 15.0和增量= 6,则阵列将包含:

5.0, 10.0, 15.0, 15.0, 10.0, 5.0 
+1

你可以使用LINQ吗?或者你应该这样做“手工”? – Yuck

+3

它是你的家庭作业吗? – Xaruth

+0

@Yuck:Linq可以使用 – descf

回答

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

嗨,我已经更新了与问题给出的信息,试图让问题更清楚 – descf

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

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

+0

如果我设置数到7或8它给出了错误的结果 – descf

+0

给我一个例子集请你..我的意思是什么是最小和最大? – nawfal

+0

只是将计数更改为7或8,其他所有内容保持不变 – descf

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