Просмотр исходного кода

переписал с использованием кортежей

kei 5 лет назад
Родитель
Сommit
6c07acd69c
1 измененных файлов с 47 добавлено и 1 удалено
  1. 47 1
      articles/5_3_1_9_classlib.md

+ 47 - 1
articles/5_3_1_9_classlib.md

@@ -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".