пытался выгуглить но не чего не смог найти. Можно ли как то упросить данный код смотрел на сайте майкрософт все возможные ответы от 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();
За ранее большое спасибо всем кто ответит ) не закидывайте меня сразу тряпками =)
-- Шесть вечера или шесть утра, господин барон?
-- Шесть дня!
"Тот самый Мюнхгаузен"
string[] TIMEOFDAY = {
"ночь","ночь","ночь","ночь", // 0 - 3
"утро","утро","утро","утро","утро","утро","утро","утро", // 4 - 11
"день","день","день","день","день", // 12 - 16
"вечер","вечер","вечер","вечер","вечер","вечер","вечер" // 17 - 23
}
string result = TIMEOFDAY[DateTime.Now.Hour];
Если именно сократить этот огромный 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;
}
Можно через 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);
А можно и вовсе заморочится со словариком:
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 поле класса).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Суть проблемы: при загрузке формы выполнялся запрос на выборку из таблицы на большое кол-во записей и при открытии формы ничего не появлялось...
Разбираюсь в не своем коде, там много обращений в БД(MS SQL SERVER) с использованием generic репозитория и много очень запутанного кода(поэтому его...