|
@@ -23,9 +23,24 @@
|
|
|
Реализуйте метод, который принимает в себя список объектов даты и времени по совершенным покупкам/заказам в рамках нашей компании, а возвращает список дат (без времени), отсортированный в порядке уменьшения частоты заказов. Это необходимо, чтобы наша компания могла прогнозировать наиболее высокий спрос на следующий год для обеспечения более качественного оказания услуг.
|
|
Реализуйте метод, который принимает в себя список объектов даты и времени по совершенным покупкам/заказам в рамках нашей компании, а возвращает список дат (без времени), отсортированный в порядке уменьшения частоты заказов. Это необходимо, чтобы наша компания могла прогнозировать наиболее высокий спрос на следующий год для обеспечения более качественного оказания услуг.
|
|
|
|
|
|
|
|
Возвращаемые данные должны содержать только даты для первого числа каждого месяца и `00:00` минут.
|
|
Возвращаемые данные должны содержать только даты для первого числа каждого месяца и `00:00` минут.
|
|
|
-Например, вам поступили следующие данные: `2019-12-12 14:43, 2019-12-01 15:05, 2019-11-04 09:01`, а, значит, самый популярный месяц - декабрь. Вам необходимо вернуть следующие данные: `2019-12-01 00:00, 2019-11-01 00:00`. В случае совпадения характеристик популярности сперва нужно вывести более ранние месяцы.
|
|
|
|
|
|
|
+Например, вам поступили следующие данные:
|
|
|
|
|
|
|
|
-Прогноз строится на основе предыдущего года. ~~Так что данные Вам будут выдаваться строго за предыдущий год.~~ *Данные будут произвольные, поэтому даты не удовлеторяющие этому условию нужно игнорировать.*
|
|
|
|
|
|
|
+```
|
|
|
|
|
+2019-12-12 14:43
|
|
|
|
|
+2019-12-01 15:05
|
|
|
|
|
+2019-11-04 09:01
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+Значит, самый популярный месяц - декабрь (два заказа). Вам необходимо вернуть следующие данные:
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+2019-12-01 00:00
|
|
|
|
|
+2019-11-01 00:00
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+В случае совпадения характеристик популярности сперва нужно вывести более ранние месяцы.
|
|
|
|
|
+
|
|
|
|
|
+Прогноз строится на основе предыдущего года. *Данные будут произвольные, поэтому даты не удовлеторяющие этому условию нужно игнорировать.*
|
|
|
|
|
|
|
|
### Спецификация метода
|
|
### Спецификация метода
|
|
|
|
|
|
|
@@ -43,16 +58,15 @@
|
|
|
|
|
|
|
|
### Создание библиотеки классов
|
|
### Создание библиотеки классов
|
|
|
|
|
|
|
|
-Создаем **новое решение**, выбрав шаблон `.NET / Class Library`.
|
|
|
|
|
|
|
+Создаем **новый** проект, установив нужные фильтры (*C#*, *Windows*, *Библиотека*) и выбрав проект для соответствующей платформы. **Мы всё делаем для .NET Core**.
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
Не забываем указывать название проекта по требованиям из ТЗ. Как вы тут напишете, так dll и будет называться.
|
|
Не забываем указывать название проекта по требованиям из ТЗ. Как вы тут напишете, так dll и будет называться.
|
|
|
|
|
|
|
|
-В итоге IDE создаст нам "рыбу" с одним файлом:
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
+В итоге IDE создаст нам "рыбу" с одним файлом:
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
namespace CompanyCoreLib
|
|
namespace CompanyCoreLib
|
|
@@ -66,8 +80,6 @@ public class Class1
|
|
|
|
|
|
|
|
По ТЗ наш класс должен называться **Analytics** - в *обозревателе решений* переименуйте файл `Class1.cs` в `Analytics.cs`. Система спросит, переименовать ли все названия в проекте - соглашаемся. В итоге наш класс должен выглядеть так:
|
|
По ТЗ наш класс должен называться **Analytics** - в *обозревателе решений* переименуйте файл `Class1.cs` в `Analytics.cs`. Система спросит, переименовать ли все названия в проекте - соглашаемся. В итоге наш класс должен выглядеть так:
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
```cs
|
|
```cs
|
|
|
namespace CompanyCoreLib
|
|
namespace CompanyCoreLib
|
|
|
|
|
|
|
@@ -76,11 +88,11 @@ public class Analytics
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Обратите внимание на наличие модификатора **public** у класса - не во всех версиях он ставится автоматически. Добавьте, если его нет.
|
|
|
|
|
|
|
+Обратите внимание на наличие модификатора **public** у класса - не во всех версиях **Visual Studio** он ставится автоматически. Добавьте, если его нет.
|
|
|
|
|
|
|
|
### Создание метода
|
|
### Создание метода
|
|
|
|
|
|
|
|
-В [спецификации](#Спецификация-метода) задано и название метода, его параметры и возвращаемый результат - запишем (не забывая про модификатор доступа **public**):
|
|
|
|
|
|
|
+В [спецификации](#спецификация-метода) задано и название метода, его параметры и возвращаемый результат - запишем (не забывая про модификатор доступа **public**):
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
public List<DateTime> PopularMonths(
|
|
public List<DateTime> PopularMonths(
|
|
@@ -124,7 +136,7 @@ foreach (DateTime iterDate in dates) {
|
|
|
|
|
|
|
|
<details>
|
|
<details>
|
|
|
|
|
|
|
|
-<summary><b>Текст под спойлером устарел! Использовать его можно, но не нужно. Лучше реализовать временный список с использованием кортежей. Это покажет ваше владение средствами языка и уменьшит количество кода/файлов.</b></summary>
|
|
|
|
|
|
|
+<summary><b>Текст под спойлером устарел! Использовать его можно, но не нужно. Лучше реализовать временный список с использованием **кортежей**. Это покажет ваше владение средствами языка и уменьшит количество кода/файлов.</b></summary>
|
|
|
|
|
|
|
|
Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого создадим класс **DateTimeWithCounter** (вообще, по современным гайдлайнам нужно каждый класс писать в отдельном файле и на демо-экзамене помните про это)
|
|
Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого создадим класс **DateTimeWithCounter** (вообще, по современным гайдлайнам нужно каждый класс писать в отдельном файле и на демо-экзамене помните про это)
|
|
|
|
|
|
|
@@ -178,17 +190,16 @@ public class Analytics
|
|
|
|
|
|
|
|
<br/>
|
|
<br/>
|
|
|
|
|
|
|
|
-**Новый код с использованием кортежей**
|
|
|
|
|
-
|
|
|
|
|
-Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого используем список [кортежей](https://metanit.com/sharp/tutorial/2.19.php)
|
|
|
|
|
|
|
+**Новый код с использованием словарей**
|
|
|
|
|
|
|
|
|
|
+Теперь нам нужно объявить словарь, в котором ключём будет дата, а значением - количество повторений этой даты.
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
public List<DateTime> PopularMonths(
|
|
public List<DateTime> PopularMonths(
|
|
|
List<DateTime> dates)
|
|
List<DateTime> dates)
|
|
|
{
|
|
{
|
|
|
- var dateTimeWithCounterList =
|
|
|
|
|
- new List<Tuple<DateTime, int>>();
|
|
|
|
|
|
|
+ var dateTimeCounterDictionary =
|
|
|
|
|
+ new Dictionary<DateTime, int>();
|
|
|
|
|
|
|
|
int previousYear = DateTime.Now.Year - 1;
|
|
int previousYear = DateTime.Now.Year - 1;
|
|
|
foreach (DateTime iterDate in dates)
|
|
foreach (DateTime iterDate in dates)
|
|
@@ -201,6 +212,10 @@ public List<DateTime> PopularMonths(
|
|
|
iterDate.Month, // месяц
|
|
iterDate.Month, // месяц
|
|
|
1, 0, 0, 0); // день
|
|
1, 0, 0, 0); // день
|
|
|
|
|
|
|
|
|
|
+ if (dateTimeCounterDictionary.ContainsKey) {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// ищем эту дату во временном списке
|
|
// ищем эту дату во временном списке
|
|
|
var index = dateTimeWithCounterList
|
|
var index = dateTimeWithCounterList
|
|
|
.FindIndex(
|
|
.FindIndex(
|
|
@@ -238,7 +253,7 @@ public List<DateTime> PopularMonths(
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригинальные, а день равен "1"
|
|
|
|
|
|
|
+Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригинальные, а день равен `1`
|
|
|
|
|
|
|
|
Метод **FindIndex** ищет **позицию** (индекс) элемента в списке. Если элемент в списке есть, то возвращает целое от "0" и выше, а если нет, то "-1".
|
|
Метод **FindIndex** ищет **позицию** (индекс) элемента в списке. Если элемент в списке есть, то возвращает целое от "0" и выше, а если нет, то "-1".
|
|
|
|
|
|
|
@@ -271,17 +286,17 @@ return dateTimeWithCounterList
|
|
|
|
|
|
|
|
В контекстном меню решения добавьте новый проект
|
|
В контекстном меню решения добавьте новый проект
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
-Обратите внимание, тип приложения (Framework или Core) должен совпадать с типом библиотеки
|
|
|
|
|
|
|
+Обратите внимание, тип приложения (**Framework** или **Core**) должен совпадать с типом библиотеки
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
В созданном приложении к контекстном меню "Зависимостей" добавьте ссылку на проект
|
|
В созданном приложении к контекстном меню "Зависимостей" добавьте ссылку на проект
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
Теперь в коде консольного приложения мы можем использовать класс из библиотеки:
|
|
Теперь в коде консольного приложения мы можем использовать класс из библиотеки:
|
|
|
|
|
|
|
@@ -319,8 +334,8 @@ foreach (var date in outDates)
|
|
|
|
|
|
|
|
## Задание
|
|
## Задание
|
|
|
|
|
|
|
|
-* Реализовать ТЗ, написанное в начале этой лекции.
|
|
|
|
|
-* Составить тестовые сценарии к этой библиотеке используя материалы лекции [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](./5_3_1_4_testcase.md). Сценарии оформить в формате MarkDown в файле readme.md в корне "решения".
|
|
|
|
|
|
|
+* Реализовать библиотеку классов, описанную в этой лекции.
|
|
|
|
|
+* Составить тестовые сценарии к этой библиотеке используя материалы лекции [Тестовые сценарии, тестовые варианты. Оформление результатов тестирования.](./5_3_1_4_testcase.md). Сценарии оформить в формате **MarkDown** в файле `readme.md` в корне "решения".
|
|
|
|
|
|
|
|
Предыдущая лекция | | Следующая лекция
|
|
Предыдущая лекция | | Следующая лекция
|
|
|
:----------------:|:----------:|:----------------:
|
|
:----------------:|:----------:|:----------------:
|