|
@@ -128,7 +128,9 @@ foreach (DateTime IterDate in dates) {
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого создадим класс **DateTimeWithCounter** (вообще, по современным гайдлайнам нужно каждый класс писать в отдельном файле и на демо-экзамене помните про это)
|
|
|
|
|
|
|
+**Следующий текст устарел! Использовать его можно, но не нужно. Лучше реализовать временный список с использованием кортежей. Это покажет ваше владение средствами языка и уменьшит количество кода/файлов.**
|
|
|
|
|
+
|
|
|
|
|
+~~Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого создадим класс **DateTimeWithCounter** (вообще, по современным гайдлайнам нужно каждый класс писать в отдельном файле и на демо-экзамене помните про это)~~
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
class DateTimeWithCounter
|
|
class DateTimeWithCounter
|
|
@@ -172,6 +174,50 @@ public List<DateTime> PopularMonths(List<DateTime> dates) {
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
+**Новый код с использованием кортежей**
|
|
|
|
|
+
|
|
|
|
|
+Теперь нам нужно объявить список объектов, в котором будет хранится дата и количество повторений этой даты. Для этого используем список [кортежей](https://metanit.com/sharp/tutorial/2.19.php)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+```cs
|
|
|
|
|
+public List<DateTime> PopularMonths(List<DateTime> dates) {
|
|
|
|
|
+ var DateTimeWithCounterList = new List<Tuple<DateTime, int>>();
|
|
|
|
|
+
|
|
|
|
|
+ int PreviousYear = DateTime.Now.Year - 1;
|
|
|
|
|
+ foreach (DateTime IterDate in dates)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (IterDate.Year == PreviousYear)
|
|
|
|
|
+ {
|
|
|
|
|
+ // вычисляем начало месяца для текущей даты
|
|
|
|
|
+ var DateMonthStart = new DateTime(IterDate.Year, IterDate.Month, 1, 0, 0, 0);
|
|
|
|
|
+
|
|
|
|
|
+ // ищем эту дату во временном списке
|
|
|
|
|
+ var index = DateTimeWithCounterList.FindIndex(item => item.Item1 == DateMonthStart);
|
|
|
|
|
+
|
|
|
|
|
+ // кортежи можно создавать по-разному
|
|
|
|
|
+ if (index == -1)
|
|
|
|
|
+ {
|
|
|
|
|
+ // такой даты нет - добавляю (используя конструктор)
|
|
|
|
|
+ DateTimeWithCounterList.
|
|
|
|
|
+ Add( new Tuple<DateTime,int>(DateMonthStart, 1) );
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ // дата есть - увеличиваем счетчик
|
|
|
|
|
+ // свойства кортежа неизменяемые, поэтому перезаписываем текущий элемент новым кортежем, который создаем статическим методом
|
|
|
|
|
+ DateTimeWithCounterList[index] = Tuple.Create(DateTimeWithCounterList[index].Item1, DateTimeWithCounterList[index].Item2 + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return DateTimeWithCounterList
|
|
|
|
|
+ .OrderByDescending(item => item.Item2)
|
|
|
|
|
+ .ThenBy(item => item.Item1)
|
|
|
|
|
+ .Select(item => item.Item1)
|
|
|
|
|
+ .ToList();
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригиналльные, а день равен "1"
|
|
Для вычисления начала месяца мы использовали один из конструкторов класса **DateTime(year, month, day, hour, minutes, seconds)**, где год и месяц берем оригиналльные, а день равен "1"
|
|
|
|
|
|
|
|
Метод **FindIndex** ищет **позицию** (индекс) элемента в списке. Если элемент в списке есть, то возвращает целое от "0" и выше, а если нет, то "-1".
|
|
Метод **FindIndex** ищет **позицию** (индекс) элемента в списке. Если элемент в списке есть, то возвращает целое от "0" и выше, а если нет, то "-1".
|