2010-02-01 4 views
0

Я хочу написать какой-то словарь, который будет принимать текущее время и вернуть то, что определяется пользователем. В качестве временного периода я имею в виду пользовательские имена для периода времени, которые считываются из файла. НапримерC# словарь, нужен совет

8: 00-9: 00 - время завтрака 9: 00-12: 00 - время работы 12: 00-13: 00 - время обеда

и т.д ...

В настоящее время у меня есть функция, основанная на if-else, если заявления

// C# syntax omitted for simplicity 
TimePeriod GetCurrentTimePeriod(DateTime t) 
{ 
if(t < 8.00) 
{ 
    return TimePeriod.Sleep; 
} 
else if(t < 9.00) 
{ 
    ... 
} 
} 

Я не доволен этим прямым решением. Я бы предпочел вместо этого использовать « ».

PS. Изменено слово TimeZone на TimePeriod, чтобы избежать путаницы с классом System.TimeZone.

+8

Я бы * сильно * рекомендуется изменить имя, которое вы используете для этой концепции. «Часовой пояс» означает нечто совершенно иное, и вы просто будете путать тех, кто читает ваш код/​​документы/что угодно. –

+0

2 Jon - Согласен, на самом деле в моем коде TimeZone - MarketState (Open, Closed и т. Д.) Я пытаюсь использовать абстрактные случаи для вопросов. –

+1

... и на ваш вопрос. –

ответ

3

Если вам нужно динамически настраивать эти «периоды времени», я предлагаю создать простой список записей, содержащих время начала, время окончания и описание, и просто запросить этот список с помощью LINQ. Так как число элементов в этом списке, вероятно, скорее всего, будет очень мало, линейный поиск делает работу и не стоит заморачиваться с помощью двоичного поиска или более сложные структуры данных как сегмента деревьев:

class PeriodOfTime { 
    public DateTime StartTime {get; set;} 
    public DateTime EndTime {get; set;} 
    public string Description {get; set;} // Use your own enum instead 
} 
// ... 
List<PeriodOfTime> periods = new List<PeriodOfTime>(); 

var timeToQuery = DateTime.Now.TimeOfDay; 
var period = periods.FirstOrDefault(p => timeToQuery >= p.StartTime && 
             timeToQuery <= p.EndTime); 
1

Кажется хорошим решением для меня, как написано. Кроме того, вы можете создать собственную карту на основе диапазона.

1

Вы не использовать TimeZone-класс, потому что вы будете получать разное время в определенном часовом поясе.

Вы можете использовать этот класс для преобразования времени, например.

TimeZone localZone = TimeZone.CurrentTimeZone; 
DateTime baseUTC = new DateTime(2010, 1, 1); 
DateTime localTime = localZone.ToLocalTime(baseUTC); 
TimeSpan localOffset = localZone.GetUtcOffset(localTime); 

Вы можете использовать простую проверку как ответ на ваш вопрос:

if (youTime >= 8.00 && youTime <= 9.00) 
return YourTypes.Breakfast; 
else if (youTime > 9.00 && youTime <= 12.00) 
return YourTypes.WorkTime; 
else 
// etc. 
+1

Вопрос не в часовых поясах. Использование названия «часового пояса» совершенно сбивает с толку, как указано в комментариях Джона. –

+1

Я понимаю вопрос и пытаюсь объяснить это неправильно в моем ответе. – sashaeve

3

Этот вопрос был задан несколько дней назад. См. Ответ здесь для некоторых идей о том, как действовать.

A dictionary object that uses ranges of values for keys

+0

Хорошо, так это интервальные деревья. Будет читать. Хотя Я согласен с моей задачей с помощью нескольких элементов простой линейной работы будет делать работу отлично. –