C#字典,需要建议

时间:2010-02-01 11:25:26

标签: c# data-structures dictionary

我想写一些接受当前时间的字典 并返回用户定义的时间段。作为time-preiod,我指的是从文件中读取的用户定义的时间段名称。例如

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 个答案:

答案 0 :(得分: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 :(得分:3)

几天前就提出了这个问题。有关如何继续的一些想法,请参阅此处的答案。

A dictionary object that uses ranges of values for keys

答案 2 :(得分:1)

对我来说似乎是一个很好的解决方案。或者,您可以设计自己的基于范围的地图。

答案 3 :(得分: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.