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 дней, чтобы можно было сравнить дней
Создайте цикл for в соответствии с HashSet и Days
Разделите начало, середину и окончание
Объедините результат в соответствии с часами открытия и закрытия, а также интервалом между днями
Я старался изо всех сил, но точно знаю, что мой код совсем не эффективен, а наоборот, беспорядочен. Я пытаюсь улучшить свои навыки C#, пожалуйста, помогите. Вот мой беспорядочный код:
namespace Livit
{
using System;
using System.Collections.Generic;
using System.Linq;
public class Restaurant
{
public WeekCollection 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(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 days, List openHours, List closeHours)
{
HashSet availableRanges = new HashSet();
List timeRanges = new List();
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 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 days = new List();
List openHours = new List();
List closeHours = new List();
// Call the opening and closing hours from each day and feed into new array
foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)).OfType().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
{
private Dictionary _collection;
public WeekCollection(T sunday, T monday, T tuesday, T wednesday, T thursday, T friday, T saturday)
{
_collection = new Dictionary();
_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];
}
}
}
В настоящее время я все еще пытаюсь найти лучший способ решить эту задачу. Будем благодарны за любую помощь.
P.S. Я выделил ту часть, где происходит моя конкатенация, эта часть, по сути, является акцентом всей задачи
Я выполнил задание, в котором требовалось распечатать строку в соответствии с предоставленным расписанием. Вот пример: [code]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 ); [/code] [b]ожидаемый результат[/b] = "Вс, Чт – Сб: 8–16, Пн – Ср: 8–17" По сути, я сделал следующее: [list] [*]Создал список дней, часов открытия и закрытия [*]Создал HashSet дней, чтобы можно было сравнить дней [*]Создайте цикл for в соответствии с HashSet и Days [*]Разделите начало, середину и окончание [*]Объедините результат в соответствии с часами открытия и закрытия, а также интервалом между днями [/list] Я старался изо всех сил, но точно знаю, что мой код совсем не эффективен, а наоборот, беспорядочен. Я пытаюсь улучшить свои навыки C#, пожалуйста, помогите. Вот мой беспорядочный код: [code]namespace Livit { using System; using System.Collections.Generic; using System.Linq;
public class Restaurant { public WeekCollection OpeningHours { get; private set; }
public Restaurant() { // No opening hours available for restaurant }
// THE EMPHASIS OF THE CHALLANGE IS THIS FUNCTION RIGHT HERE!!! // Parse the date into desired format public string DateParser(List days, List openHours, List closeHours) { HashSet availableRanges = new HashSet(); List timeRanges = new List(); 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 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 days = new List(); List openHours = new List(); List closeHours = new List(); // Call the opening and closing hours from each day and feed into new array foreach (DayOfWeek day in Enum.GetValues(typeof(DayOfWeek)).OfType().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(int openingHour, int closingHour) { OpeningTime = TimeSpan.FromHours(openingHour); ClosingTime = TimeSpan.FromHours(closingHour); }
}
public class WeekCollection { private Dictionary _collection;
public WeekCollection(T sunday, T monday, T tuesday, T wednesday, T thursday, T friday, T saturday) { _collection = new Dictionary(); _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]; }
} } [/code] [b]В настоящее время я все еще пытаюсь найти лучший способ решить эту задачу. Будем благодарны за любую помощь.[/b] P.S. Я выделил ту часть, где происходит моя конкатенация, эта часть, по сути, является акцентом всей задачи