C# работа с DateTime

121
10 июня 2019, 00:30

пытался выгуглить но не чего не смог найти. Можно ли как то упросить данный код смотрел на сайте майкрософт все возможные ответы от DateTime и обнаружил что можно получить только время дату и выходные или нет. Код ниже работает но просто стало интересно можно ли упростить код

string htime = string.Format("{0:hh tt}", DateTime.Now);
        int stim = Convert.ToInt16(htime);
        string Result = "";
        switch (stim)
        {
            case 00:
            case 01:
            case 02:
            case 03:
                Result = "ночь";
                break;
            case 04:
            case 05:
            case 06:
            case 07:
            case 08:
            case 09:
            case 10:
            case 11:
                Result = "утро";
                break;
            case 12:
            case 13:
            case 14:
            case 15:
            case 16:
                Result = "день";
                break;
            case 17:
            case 18:
            case 19:
            case 20:
            case 21:
            case 22:
            case 23:
                Result = "вечер";
                break;
            default:
                Result = "test";
                break;
        }
        Console.WriteLine(Result);
        Console.ReadLine();

За ранее большое спасибо всем кто ответит ) не закидывайте меня сразу тряпками =)

Answer 1

-- Шесть вечера или шесть утра, господин барон?

-- Шесть дня!

"Тот самый Мюнхгаузен"

string[] TIMEOFDAY = {
  "ночь","ночь","ночь","ночь", // 0 - 3
  "утро","утро","утро","утро","утро","утро","утро","утро", // 4 - 11
  "день","день","день","день","день", // 12 - 16
  "вечер","вечер","вечер","вечер","вечер","вечер","вечер" // 17 - 23
}
string result = TIMEOFDAY[DateTime.Now.Hour];
Answer 2

Если именно сократить этот огромный switch, то...

Вариант 1:
Переход на if/else с указанием диапазона.

if (stim >= 0 && stim <= 3)
    result = "ночь";
else if (stim >= 4 && stim <= 11)
    result = "утро";
else if (stim >= 12 && stim <= 16)
    result = "день";
else if (stim >= 17 && stim <= 23)
    result = "вечер";
else
    result = "test";

Вариант 2:
Использовать when (c# 7.0) в switch.

switch (stim)
{
    case int night when night >= 0 && night <= 3:
        result = "ночь";
        break;
    case int morning when morning >= 4 && morning <= 11:
        result = "утро";
        break;
    case int day when day >= 12 && day <= 16:
        result = "день";
        break;
    case int evening when evening >= 17 && evening <= 23:
        result = "вечер";
        break;
    default:
        result = "test";
        break;
}
Answer 3

Можно через enum:

 enum DayTime
    {
        Night = 3,
        Morning = 11,
        Day = 16,
        Evening = 23
    }
    var currentTime = (DayTime)Enum.GetValues(typeof(DayTime)).Cast<int>().OrderBy(v => v).FirstOrDefault(v => number <= v);
Answer 4

А можно и вовсе заморочится со словариком:

 Dictonary<int,string> TimeOfDay = new Dictonary<int,string>
 {
       {0, "ночь"},
       {1, "ночь"},
       {2, "ночь"},
       {3, "ночь"},
       {4, "утро"},
       {5, "утро"},
       {6, "утро"},
       {7, "утро"},
       {8, "утро"},
       {9, "утро"},
       {10, "утро"},
       {11, "утро"},
       {12, "день"},
       {13, "день"},
       {14, "день"},
       {15, "день"},
       {16, "день"},
       {17, "вечер"},
       {18, "вечер"},
       {19, "вечер"},
       {20, "вечер"},
       {21, "вечер"},
       {22, "вечер"},
       {23, "вечер"}
 };

вызов

TimeOfDay[DateTime.Hour];

Это конечно не сократит код, но зато упростит его редактирование, а вдруг вы захотите поменять часы. В случае какой-либо сортировки в первом ответе (ответ от @Igor) у вас может случится беда, и вы можете не получить нужный ответ, второй ответ хорош (ответ от @EvgeniyZ), но при этом его можно усовершенствовать, моей идеей:

 Dictonary<int,string> TimeOfDay
 { 
  get{
    var res = new Dictonary<int,string>();
    for(int i=0;i<24;i++)
    {
        if (i >= 0 && i<= 3)
         res.Add(i, "ночь");
       else if (i >= 4 && i <= 11)
         res.Add(i,"утро");
      else if (i >= 12 && i <= 16)
         res.Add(i, "день");
     else if (i >= 17 && i <= 23)
         res.Add(i,"вечер");
    }
   return res;
  }
 }

Вызов все тот же TimeOfDay[DateTime.Hour]; при этом все выглядит изящнее, но может работать чуть дольше, для ускорения можно создать поле класса в виде словарика, а при инициализации выполнять метод который выполнит код который внесен в get ( конечно используя вместо res поле класса).

READ ALSO
Преобразовать object[] в string[]

Преобразовать object[] в string[]

Собственно вопрос в шапке

147
WPF C# Обращение к объекту через ссылку

WPF C# Обращение к объекту через ссылку

Пытаюсь обратиться к элементу из ссылок таким образом:

138
Загрузка таблицы одновременно с формой

Загрузка таблицы одновременно с формой

Суть проблемы: при загрузке формы выполнялся запрос на выборку из таблицы на большое кол-во записей и при открытии формы ничего не появлялось...

133
Как может быть deadlock для выборки из базы?

Как может быть deadlock для выборки из базы?

Разбираюсь в не своем коде, там много обращений в БД(MS SQL SERVER) с использованием generic репозитория и много очень запутанного кода(поэтому его...

157