2016-12-01 47 views
0

編輯:我意識到我一直在徹底改變它,經過一次徹底的改革,讓它工作。感謝提示傢伙,我會牢記他們的未來。從c中的循環返回每個值#

我在程序中遇到了一個不尋常的問題。我需要做的是找出兩次之間的差異,將其除以1.5小時,然後返回開始時間,然後每開始時間增加1.5小時。因此,如果時間是上午11:45 - 下午2:45,時差爲三小時,3/1.5 = 2,然後返回上午11:45和下午1:15。此刻,我可以做所有事情,除了多次返回。根據我所嘗試的方法,它會返回初始時間(上午11:45),第一次增量(下午1:15)或結束時間(下午2:45)。到目前爲止,我已經嘗試了幾種不同類型的for和do/while循環。我最接近的是簡單地將開始時間和增加的時間連接起來,但開始和結束時間可以在3到6個小時的範圍內,所以這不是一個實際的方法。

最新的東西我想:

int i = 0; 
do{ 
    i++; 
    //Start is the starting time, say 11:45 am 
    start = start.AddMinutes(90); 
    return start.ToShortTimeString(); 
} while (i < totalSessions); //totalSessions is the result of hours/1.5 

和我打電話動態標籤上的功能(這也是在for循環):

z[i] = new Label(); 
z[i].Location = new Point(PointX, PointZ); 
z[i].Name = "sessionTime_" + i; 
z[i].Text = getPlayTimes(dt.Rows[i][1].ToString()); 
tabPage1.Controls.Add(z[i]); 
z[i].BringToFront(); 
PointZ += z[i].Height; 

我很新到C#所以我想我只是誤解了某個地方的東西。

+3

你不能從函數''返回'多次。如果將函數的返回類型更改爲「IEnumerable 」,則可以使用「yield return」,但不清楚這是否是您想要執行的操作。 –

+0

第一段太複雜,無法理解。 –

+0

謝謝@DStanley,我不知道甚至存在。 –

回答

1

由於您尚未提供您正在使用的完整代碼,因此確定您的確切用例有點困難。但是,你可以做你正在使用yield return功能叫什麼:

public IEnumerable<string> GetPlayTimes() 
{ 
    int i = 0; 
    do 
    { 
     i++; 
     //Start is the starting time, say 11:45 am 
     start = start.AddMinutes(90); 
     yield return start.ToShortTimeString(); 
    } while (i < totalSessions); //totalSessions is the result of hours/1.5 
} 

,然後用它像這樣:

foreach (var time in GetPlayTimes()) 
{ 
    // Do something with time 
} 
+0

謝謝,我會給它一個鏡頭。 –

3

我認爲你正在試圖解決這個問題的錯誤的方式。您不需要在返回時返回每個值,而是創建一個集合即列表,並將每個結果推送到列表中,直到滿足完成條件。

然後,返回整個數組作爲返回值。通過這種方式,您將擁有一個很好的自包含功能,它不會與其他邏輯產生交叉擔憂 - 它只是一項小任務,但它做得很好。

祝你好運!