Словарь C #, нужен совет - PullRequest
0 голосов
/ 01 февраля 2010

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

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

и т.д ...

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

// 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.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2010

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

Объект словаря, который использует диапазоны значений для ключей

3 голосов
/ 01 февраля 2010

Если вам нужно сделать эти «периоды времени» динамически регулируемыми, я предлагаю создать простой Список записей, содержащий время начала, время окончания и описание, и просто запросить этот список с помощью 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 голос
/ 01 февраля 2010

Вам не нужно использовать класс 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 голос
/ 01 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...