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循环
- 将开始、中间和结束分开
- 根据开放时间和关闭时间以及两天之间的间隔连接结果
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);
_集合。添加(星期一、星期一、星期一);
_集合。添加(星期二,星期二,星期二);
_集合。添加(星期三,星期三,星期三);
_集合。添加(星期四,星期四,星期四);
_集合。添加(星期五,星期五,星期五);
_集合。添加(星期六,星期六,星期六);
}
公众无法获取(星期一星期五)
{
退货(收款)(周日);;
}
}
}
目前,我还在努力