C#字典,需要建议

C#字典,需要建议,c#,data-structures,dictionary,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) { r

我想写一本可以接受当前时间的词典 并返回用户定义的时间段。作为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)
 { 
   ...
 }
}
/C#为了简单起见省略了语法
TimePeriod GetCurrentTimePeriod(日期时间t)
{
如果(t<8.00)
{
返回时间段。睡眠;
}
否则,如果(t<9.00)
{ 
...
}
}
我对这个直接的解决方案不满意。我想要一些 有点像字典


另外,将单词TimeZone改为TimePeriod,以避免与System.TimeZone类混淆。

如前所述,这似乎是一个很好的解决方案。或者,您可以设计自己的基于范围的地图。

如果您需要动态调整这些“时段”,我建议您建立一个包含开始时间、结束时间和描述的简单记录列表,并使用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);
类周期时间{
公共日期时间开始时间{get;set;}
公共日期时间结束时间{get;set;}
公共字符串描述{get;set;}//请改用您自己的枚举
}
// ... 
列表周期=新列表();
var timeToQuery=DateTime.Now.TimeOfDay;
var period=periods.FirstOrDefault(p=>timeToQuery>=p.StartTime&&

timeToQuery您不必使用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.

if(youTime>=8.00&&youTime 9.00&&youTime这是几天前提出的问题。有关如何继续的一些想法,请参见此处的答案


我强烈建议您更改此概念的名称。“时区”的含义完全不同,您只会让阅读您的代码/文档/任何东西的人感到困惑。2 Jon-同意,实际上在我的代码中,时区是MarketState(打开、关闭等)我试着用抽象的例子来提问。问题根本不是关于时区的。使用“时区”这个名字完全令人困惑,正如Jon在评论中指出的。我理解这个问题,并试图在我的回答中解释这一误解。好吧,这就是区间树。我将阅读。虽然我同意我的任务,要求一些项目,但简单的线性作业将完美地完成这项工作。