2013-05-15 36 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); 
    } 
}