2016-12-01 2 views
0

EDIT: Я понял, что я прошел совсем не так, и после капитального ремонта заработал. Спасибо за советы, ребята, я буду помнить их о будущем.Возврат каждого значения из цикла for в C#

У меня возникла необычная проблема в моей программе. Мне нужно найти разницу между двумя моментами, разделить ее на 1,5 часа, а затем вернуть начальное время, за которым следует каждые 1,5 часа прироста времени начала. Так что, если время было 11:45 - 14:45, разница во времени - три часа, 3/1,5 = 2, затем возвращение 11:45 и 13:15. На данный момент я могу делать все, кроме возвращения более одного раза. В зависимости от того, что я пробовал, он возвращает либо начальное время (11:45), первое приращение (1:15 pm), либо время окончания (14: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 

и я вызова функции динамической метки (который также в цикле):

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

Вы не можете «возвращать» из функции несколько раз. Вы можете использовать 'yield return', если вы измените возвращаемый тип функции на' IEnumerable ', но неясно, действительно ли это то, что вы хотите сделать. –

+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

Я думаю, вы пытаетесь решить проблему неправильно. Вместо того, чтобы возвращать каждое значение по мере того, как вы приходите к нему, создайте коллекцию, т.е. List, и нажмите каждый из своих результатов в список до тех пор, пока не будет выполнено условие завершения.

Затем верните весь массив в качестве возвращаемого значения. Таким образом, у вас будет хорошая автономная функция, которая не имеет проблем с другой логикой - она ​​делает только одну небольшую задачу, но делает это хорошо.

Удачи вам!

Смежные вопросы