C# 利用DayOfWeek提高challange的效率

C# 利用DayOfWeek提高challange的效率,c#,list,for-loop,dayofweek,C#,List,For Loop,Dayofweek,我完成了这个挑战,要求根据提供的时间表打印一个字符串。以下是一个例子: var restaurant = new Restaurant( new OpeningHour(8,16), // Sunday new OpeningHour(8,17), // Monday new OpeningHour(8,17), // Tuesday new OpeningHour(8,17), // Wednesd

我完成了这个挑战,要求根据提供的时间表打印一个字符串。以下是一个例子:

var restaurant = new Restaurant(
            new OpeningHour(8,16), // Sunday
            new OpeningHour(8,17), // Monday
            new OpeningHour(8,17), // Tuesday
            new OpeningHour(8,17), // Wednesday
            new OpeningHour(8,16), // Thursday
            new OpeningHour(8,16), // Friday
            new OpeningHour(8,16)  // Saturday
        );
预期输出结果=“星期四至星期六:8-16,星期一至星期三:8-17”

我所做的基本上是:

  • 创建日期、开放时间和关闭时间的列表
  • 创建一个日期的哈希集,以便比较这些日期
  • 根据HashSet和Days创建for循环
  • 将开始、中间和结束分开
  • 根据开放时间和关闭时间以及两天之间的间隔连接结果
我已经尽了最大的努力,但我知道我的代码一点也不高效,而是凌乱不堪。我正在努力提高我的C#技能,请帮忙。这是我的乱码:

namespace Livit
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class Restaurant
    {
        public WeekCollection<OpeningHour> OpeningHours { get; private set; }

        public Restaurant() {
            // No opening hours available for restaurant
        }

        public Restaurant(OpeningHour monday, OpeningHour tuesday, OpeningHour wednesday, OpeningHour thursday, OpeningHour friday, OpeningHour saturday, OpeningHour sunday)
        {
            OpeningHours = new WeekCollection<OpeningHour>(monday, tuesday, wednesday, thursday, friday, saturday, sunday);
        }
        
        // THE EMPHASIS OF THE CHALLANGE IS THIS FUNCTION RIGHT HERE!!!
        // Parse the date into desired format
        public string DateParser(List<DayOfWeek> days, List<TimeSpan> openHours, List<TimeSpan> closeHours)
        {
          HashSet<string> availableRanges = new HashSet<string>();
          List<string> timeRanges = new List<string>();
          DayOfWeek current = DayOfWeek.Sunday;
          string result = "";
          for (int i = 0 ; i < days.Count; i++){
            string timeRange = openHours[i].ToString().Substring(1,1)+'-'+closeHours[i].ToString().Substring(0,2);
            availableRanges.Add(timeRange);
            timeRanges.Add(timeRange);
          }
          List<string> arToList= availableRanges.ToList();
          for (int i = 0 ; i < arToList.Count; i++)
            {
              for (int j = 0 ; j < timeRanges.Count; j++){
                if(timeRanges[j] == arToList[i]){
                  
                  
                  // First Item
                  if(j==0 ){
                    result += days[j].ToString().Substring(0,3);
                  }
                  // Last Item
                  else if(j==timeRanges.Count-1){
                    char last = result.Last();
                    if(last != ' '){
                        result += " - ";
                      } 
                    result += days[j].ToString().Substring(0,3);
                  }
                  // Everything in the middle
                  else{
                    if(days[j]-current > 1){
                      result += ", ";
                    }
                    if(timeRanges[j] != timeRanges[j-1] ){
                      result += days[j].ToString().Substring(0,3);
                    } else if (timeRanges[j] == timeRanges[j-1]){
                      char last = result.Last();
                      if(last != ' '){
                        result += " - ";
                      } 
                      if(timeRanges[j] != timeRanges[j+1]){
                        result += days[j].ToString().Substring(0,3);
                      }
                    }
                  }
                  
                  current = days[j];
                } 
              }
              
              result += ": " + arToList[i];
              if(i!=arToList.Count-1){
                result += ", ";
              }
            } 
          Console.WriteLine(result);
          return result;
        }

        public string GetOpeningHours()
        {
            // Declare List for each attribute
            List<DayOfWeek> days = new List<DayOfWeek>();
            List<TimeSpan> openHours = new List<TimeSpan>();
            List<TimeSpan> closeHours = new List<TimeSpan>();
            // Call the opening and closing hours from each day and feed into new array
            foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)).OfType<DayOfWeek>().ToList()) {
              TimeSpan openHour = OpeningHours.Get(day).OpeningTime;
              TimeSpan closeHour = OpeningHours.Get(day).ClosingTime;
              days.Add(day);
              openHours.Add(openHour);
              closeHours.Add(closeHour);
            }
            return DateParser(days,openHours,closeHours);
            
            
            
            throw new NotImplementedException();
        }
    }

    public class OpeningHour
    {
        public TimeSpan OpeningTime { get; private set; }
        public TimeSpan ClosingTime { get; private set; }

        public OpeningHour(TimeSpan openingTime, TimeSpan closingTime)
        {
            OpeningTime = openingTime;
            ClosingTime = closingTime;
        }

        public OpeningHour(int openingHour, int closingHour)
        {
            OpeningTime = TimeSpan.FromHours(openingHour);
            ClosingTime = TimeSpan.FromHours(closingHour);
        }

    }

    public class WeekCollection<T>
    {
        private Dictionary<DayOfWeek, T> _collection;

        public WeekCollection(T sunday, T monday, T tuesday, T wednesday, T thursday, T friday, T saturday)
        {
            _collection = new Dictionary<DayOfWeek, T>();
            _collection.Add(DayOfWeek.Sunday, sunday);
            _collection.Add(DayOfWeek.Monday, monday);
            _collection.Add(DayOfWeek.Tuesday, tuesday);
            _collection.Add(DayOfWeek.Wednesday, wednesday);
            _collection.Add(DayOfWeek.Thursday, thursday);
            _collection.Add(DayOfWeek.Friday, friday);
            _collection.Add(DayOfWeek.Saturday, saturday);
        }

        public T Get(DayOfWeek dayOfWeek)
        {
            return _collection[dayOfWeek];
        }

    }
}
Livit
{
使用制度;
使用System.Collections.Generic;
使用System.Linq;
公共餐厅
{
公共周集合开放小时数{get;private set;}
公共餐厅(){
//餐厅没有营业时间
}
公共餐厅(周一、周二、周三、周四、周五、周六、周日)
{
OpeningHours=新的一周集合(周一、周二、周三、周四、周五、周六、周日);
}
//挑战的重点是这里的这个功能!!!
//将日期解析为所需格式
公共字符串DateParser(列表天数、列表开放小时数、列表关闭小时数)
{
HashSet availableRanges=新HashSet();
列表时间范围=新列表();
DayOfWeek current=DayOfWeek.Sunday;
字符串结果=”;
对于(int i=0;i1){
结果+=“,”;
}
如果(时间范围[j]!=时间范围[j-1]){
结果+=天[j].ToString().Substring(0,3);
}else if(时间范围[j]==时间范围[j-1]){
char last=result.last();
如果(最后一个!=''){
结果+=“-”;
} 
如果(时间范围[j]!=时间范围[j+1]){
结果+=天[j].ToString().Substring(0,3);
}
}
}
当前=天数[j];
} 
}
结果+=”:“+arToList[i];
如果(i!=arToList.Count-1){
结果+=“,”;
}
} 
控制台写入线(结果);
返回结果;
}
公共字符串GetOpeningHours()
{
//为每个属性声明列表
列表天数=新列表();
List openHours=新列表();
List closeHours=新列表();
//从每天开始调用开始和结束时间,并输入新阵列
foreach(Enum.GetValues中的DayOfWeek日(typeof(DayOfWeek)).OfType().ToList()中的DayOfWeek日){
TimeSpan openHour=OpeningHours.Get(day).OpeningTime;
TimeSpan closeHour=打开小时数。获取(天)。关闭时间;
天。添加(天);
添加(openHour);
closeHours.Add(closeHours);
}
返回日期分析器(天、开放小时、关闭小时);
抛出新的NotImplementedException();
}
}
公开课开放时间
{
public TimeSpan OpeningTime{get;private set;}
公共TimeSpan ClosingTime{get;private set;}
公共开放时间(TimeSpan开放时间、TimeSpan关闭时间)
{
OpeningTime=OpeningTime;
ClosingTime=ClosingTime;
}
公共开放小时(国际开放小时、国际关闭小时)
{
OpeningTime=TimeSpan.FromHours(OpeningHours);
ClosingTime=时间跨度FromHours(closingHour);
}
}
公共类周集合
{
私人字典(藏书),;
公共周集合(T周日、T周一、T周二、T周三、T周四、T周五、T周六)
{
_集合=新字典();
_收藏。添加(DayOfWeek.Sunday,Sunday);
_集合。添加(星期一、星期一、星期一);
_集合。添加(星期二,星期二,星期二);
_集合。添加(星期三,星期三,星期三);
_集合。添加(星期四,星期四,星期四);
_集合。添加(星期五,星期五,星期五);
_集合。添加(星期六,星期六,星期六);
}
公众无法获取(星期一星期五)
{
退货(收款)(周日);;
}
}
}
目前,我还在努力