Повышение эффективности задач с помощью DayOfWeekC#

Место общения программистов C#
Ответить
Anonymous
 Повышение эффективности задач с помощью DayOfWeek

Сообщение Anonymous »

Я выполнил задание, в котором требовалось распечатать строку в соответствии с предоставленным расписанием. Вот пример:

Код: Выделить всё

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. Я выделил ту часть, где происходит моя конкатенация, эта часть, по сути, является акцентом всей задачи

Подробнее здесь: https://stackoverflow.com/questions/646 ... -dayofweek
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»