Репозиторий внешнего тренинга "ASP.NET MVC Web Applications. Q3 2019"
Продолжительность тренинга 16.09.2019 - 30.11.2019
- Info
- Stage 1. Self-study (05.08.2019 - 15.09.2019)
- Stage 2. (16.09.2019 - 30.11.2019)
- Day 1. 16.09.2019
- Day 2. 17.09.2019
- Day 3. 19.09.2019
- Day 4. 23.09.2019
- Day 5. 24.09.2019
- Day 6. 26.09.2019
- Day 7. 30.09.2019
- Day 8. 01.10.2019
- Day 9. 03.10.2019
- Day 10. 07.10.2019
- Day 11. 08.10.2019
- Day 12. 14.10.2019
- Day 13. 15.10.2019
- Day 14. 17.10.2019
- Day 15. 21.10.2019
- Day 16. 22.10.2019
- Day 17. 24.10.2019
- Day 18. 28.10.2019
- Day 19. 31.10.2019
- Day 20. 04.11.2019
- Day 21. 05.11.2019
- Day 22. 11.11.2019
- Day 23. 12.11.2019
- Day 24. 14.11.2019
- Понедельник 8.30 - 12.30
- Вторник 8.30 - 12.30
- Четверг 8.30 - 12.30
- Пятница (возможен, вебинар) 8.30 - 12.30
TODO
- Выслать на электронный адрес [email protected] письмо с указанием своего gmail-acc (названного по шаблону [email protected] (в случае существования "адекватного" аккаунта не обязательно)).
- Установить IDE Visual Studio Community 2019 (англоязычную версию) или другие IDE.
- Установить StyleCop.
- Установить LINQPad.
- Задания выполняются самостоятельно.
- Логика решения задачи помещается в проект типа Class Library в рамках Solution-а, который называется по шаблону NET.Autumn.2019.Lastname.N (где N- номер дня выполняемого задания в формате а-ля 01, 02, … 12).
- Тестирование решенной задачи выполняется в рамках вышеуказанного Solution-а с использованием консольного приложения или тестовых фреймворков Microsoft Unit Testing Framework или NUnit (оговаривается для каждого задания).
- Выполненные задания выкладываются на github не позднее указанного срока (обратить внимание на файл .gitignore).
- На github-e соблюдать определенную структуру (пример).
- следовать правилам именования в репозитории;
- обновлять файл readme.md корневой папки репозитория согласно статусу выполненных задач.
- Обязательным требованием для любой выполняемой задачи является ее соответствие Settings.StyleCop.
- Обязательным требованием для любой выполняемой задачи является наличие XML-комментариев во всех библиотеках классов в коде.
-
Ознакомиться с проектом DemoSolution.
-
Ознакомиться с Coding Standards for .NET, Coding Standards for .NET.
Дополнительно:
-
Essential C# 7.0 - Sixth Edition. Chapter 22: The Common Language Infrastructure.
-
Джеффри Рихтер. CLR via C#. Часть I. Основы CLR.
- Реализовать методы пузырьковой, быстрой и сортировки слиянием для упорядчивания элементов целочисленного массива по нестрогому возрастанию (методы поместить в статический класс ArrayExtension, тип проекта Class Library).
Одномерный массив считать упорядоченным, если отношение порядка выполняется для элементов, индексы которых удовлетворяют некоторому заданному условию (например, диапазон и шаг изменения, удоблетворение условия кратности заданной цифре и т.п.), а само отношение порядка определяется некоторой функцией-ключем (например, определяющей количество заданного символа в p-ичном (2<=p<=16) представлении числа, модуль числа и т.п.). Для получения p-ичного строкового представления числа готовые классы-конверторы не использовать!
- Протестировать работу методов с использованием тестового фреймворка NUnit. Для тест-кейсов
в качестве функции-ключа использовать:
- модуль целочисленного значения элемента массива;
- количество вхождений заданного символа c в p-ичном представлении элемента массива;
в качестве условия для индексов использовать:
- четность;
- нечетность;
- кратность заданной цифре d. - Рассмотреть вариант тестирования массивов большой размерности, элементы которых сгенерированны случайным образом.
При выполнение задач данного дня и дней до темы "Делегаты" и "LINQ" запрещено использование типа делагат и LINQ-запросов в библиотеках классов.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Link to .cs-file here | Link to NUnit Tests - cs-file here | Link to Tests Generator code - cs-file - Optional |
- Ian Griffiths. Programming C# 5.0. Chapter 2, Numeric Types.
- Joseph Albahari, Ben Albahari C# 5.0 (6.0) in a Nutshell. Chapter 6. Framework Fundamentals - Working with Numbers
- The Art of Unit Testing. ROY OSHEROVE. PART 1 GETTING STARTED.
- Что нужно знать про арифметику с плавающей запятой
- Get started with unit testing или Приступая к работе с модульным тестированием
- Архитектура компьютера. Э. Таненбаум. Приложение А, Приложение B
- IEEE-754 Floating Point Converter
- Наглядное объяснение чисел с плавающей запятой
- Взгляд со стороны: Стандарт IEEE754
- Представление вещественных чисел
- Что внутри числа с плавающей точкой и как оно работает
- IEEE 754 - стандарт двоичной арифметики с плавающей точкой
Дополнительно:
( - 20.09.2019, 24.00) Даны два целых знаковых четырехбайтовых числа и две позиции битов i и j (i<=j). Реализовать алгоритм вставки первых (j - i + 1) битов второго числа в первое так, чтобы биты второго числа занимали позиции с бита i по бит j (биты нумеруются справа налево). Решение оформить в виде статического метода InsertNumberIntoAnother статического класса NumbersExtension. Разработать модульные тесты (NUnit и MS Unit Test - (DDT))) для тестирования метода. (Ниже схема-пояснение к алгоритму). Примерные тест-кейсы
[TestCase(2728, 655, 3, 8, ExpectedResult = 2680)]
[TestCase(554216104, 15, 0, 31, ExpectedResult = 15)]
[TestCase(-55465467, 345346, 0, 31, ExpectedResult = 345346)]
[TestCase(554216104, 4460559, 11, 18, ExpectedResult = 554203816)]
[TestCase(-1, 0, 31, 31, ExpectedResult = 2147483647)]
[TestCase(-2147483648, 2147483647, 0, 30, ExpectedResult = -1)]
[TestCase(-2223, 5440, 18, 23, ExpectedResult = -16517295)]
[TestCase(2147481425, 5440, 18, 23, ExpectedResult = 2130966353)]
NumbersExtension.InsertNumberIntoAnother(8, 15, 8, 3) => ArgumentException
NumbersExtension.InsertNumberIntoAnother(8, 15, -1, 3) => ArgumentOutOfRangeException
NumbersExtension.InsertNumberIntoAnother(8, 15, 32, 32) => ArgumentOutOfRangeException
NumbersExtension.InsertNumberIntoAnother(8, 15, 0, 32) => ArgumentOutOfRangeException
...
( - 19.09.2019, 24.00) Реализовать рекурсивный алгоритм поиска максимального элемента в неотсортированном целочисленом массиве. Решение оформить в виде статического метода FindMximumItem статического класса ArrayExtension. Разработать модульные тесты NUnit для тестирования метода. Рассмотреть вариант тестирования массивов большой размерности, элементы которых сгенерированны случайным образом.
( - 21.09.2019, 24.00)) Реализовать алгоритм поиска в целочисленном массиве индекса элемента, для которого сумма элементов слева и сумма элементов справа равны. Решение оформить в виде статического метода FindBalanceIndex статического класса ArrayExtension (п. 2). Если такого элемента не существует вернуть null.
( - 22.09.2019, 24.00)) Реализовать метод, который принимает массив целых чисел и фильтрует его таким образом, чтобы на выходе был получен новый массив, состоящий только из элементов, которые содержат заданную цифру. (LINQ-запросы не использовать!) В случае, если таких элементов нет, вернуть пустой массив. Решение оформить в виде статического метода FilterArrayByKey статического класса ArrayExtension (п. 2). Например, для цифры 7, метод FilterArrayByKey для набора {7,1,2,3,4,5,6,7,68,69,70,15,17} возвращает набор {7,7,70,17}. Разработать модульные тесты NUnit и MS Unit Test для тестирования метода. Примерные тест-кейсы
[TestCase(new[] { 2212332, 1405644, -1236674 }, 0, ExpectedResult = new[] { 1405644 })]
[TestCase(new[] { 53, 71, -24, 1001, 32, 1005 }, 2, ExpectedResult = new[] { -24, 32 })]
[TestCase(new[] { -27, 173, 371132, 7556, 7243, 10017 }, 7, ExpectedResult = new[] { -27, 173, 371132, 7556, 7243, 10017 })]
[TestCase(new[] { 7, 2, 5, 5, -1, -1, 2 }, 9, ExpectedResult = new int[0])]
ArrayExtension.FilterArrayByKey(new int[0], 0)) => ArgumentException
ArrayExtension.FilterArrayByKey(new int[] { 1, 2 }, -1) => ArgumentOutOfRangeException
ArrayExtension.FilterArrayByKey(null, 0) => ArgumentNullException
...
Task | Solution Status | Solution Link | MS Test Status | MS Test Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|---|---|
1 | Link to .cs-file here | Link to MS Tests - cs-file here | Link to NUnit Tests - cs-file here | ||||
2 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||||
3 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||||
4 | Link to .cs-file here | Link to MS Tests - cs-file here | Link to NUnit Tests - cs-file here |
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013 Chapter 10: Methods
- ( - 24.09.2019, 24.00) Реализовать алгоритм, позволяющий вычислять корень n-ой степени ( n ∈ N ) из вещественного числа а методом Ньютона с заданной точностью. Решение оформить в виде статического метода FindNthRoot статического класса MathExtension.
- Разработать модульные тесты. Примерные тест кейсы:
- [TestCase(1, 5, 0.0001,ExpectedResult = 1)]
- [TestCase(8, 3, 0.0001,ExpectedResult = 2)]
- [TestCase(0.001, 3, 0.0001,ExpectedResult = 0.1)]
- [TestCase(0.04100625,4 , 0.0001, ExpectedResult = 0.45)]
- [TestCase(8, 3, 0.0001, ExpectedResult = 2)]
- [TestCase(0.0279936, 7, 0.0001, ExpectedResult = 0.6)]
- [TestCase(0.0081, 4, 0.1, ExpectedResult = 0.3)]
- [TestCase(-0.008, 3, 0.1, ExpectedResult = -0.2)]
- [TestCase(0.004241979, 9, 0.00000001, ExpectedResult = 0.545)]
- [a = -0.01, n = 2, accurancy = 0.0001] <- ArgumentException
- [a = 0.001, n = -2, accurancy = 0.0001] <- ArgumentException
- [a = 0.01, n = 2, accurancy = -1] <- ArgumentException
- ...
- Разработать модульные тесты. Примерные тест кейсы:
- ( - 25.09.2019, 24.00) Реализовать метод, который для данного положительное целого число находит ближайшее меньшее целое, состоящее из цифр исходного числа, если такое число существует. Решение оформить в виде статического метода FindPreviousLessThan статического класса NumbersExtension Task 1. Разработать модульные тесты для тестирования метода.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||
2 | Link to .cs-file here | Link to NUnit Tests - cs-file here |
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 3. Creating Types in C#
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013.
- Chapter 9. Introducing Types
-
- Проанализировать код, полученный при решении задачи Task 4, на предмет возможности его использования для получения (из исходного) массива, состоящего только из тех элементов исходного, запись которых является полиндромом (симметричным)(например 121, 1345431, 122221 и т.д.). Функцию, определяющую является ли число полиндромом, реализовать как рекурсивную.
- Добавить, если требуется, недостающую функциональность.
- Проанализировать полученный код на возможность его использования для получения (из исходного) массива, состоящего только из четных элементов исходного. Добавить, если требуется, недостающую функциональность.
- Предложить вариант общей формулировки решенных задач.
- Полученный методы (методы) оформить как метод (методы) расширения для целочисленных массивов.
-
- В статический класс MathExtension (п. 1) добавть FindGcdByEuclidean - методы которого позволяют выполнять вычисления НОД по алгоритму Евклида для двух, трех и т.д. целых чисел (http://en.wikipedia.org/wiki/Euclidean_algorithm , https://habrahabr.ru/post/205106/, https://habrahabr.ru/post/205106/). Добавить методы, которые помимо вычисления НОД, предоставляют дополнительную возможность определения значение времени, необходимое для выполнения расчета. К разработанному классу добавить FindGcdByStein-методы, реализующие алгоритм Стейна (бинарный алгоритм Евклида) для расчета НОД двух, трех и т.д. целых чисел (http://en.wikipedia.org/wiki/Binary_GCD_algorithm, https://habrahabr.ru/post/205106/ ), а также методы, предоставляющие дополнительную возможность определения значение времени, необходимое для выполнения расчета. Рассмотреть различные возможности реализации методов, возвращающих время вычисления НОД. Разработать модульные тесты.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||
2 | Link to .cs-file here | Link to NUnit Tests - cs-file here |
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013 Chapter 10: Methods
- Methods in details
- методы расширения
- паттерн проектирования Singleton
- класс Lazy
- перегрузка операций
-
( - 04.09.2019, 18.09.2019 (version 1.0))
Разработать систему типов для описания работы с банковским счетом. Состояние счета определяется его номером, данными о владельце счета (имя, фамилия, e-mail), суммой на счете, его текущим состоянием (активен, закрыт, заморожен ...) и некоторыми бонусными баллами, которые увеличиваются каждый раз при пополнении счета/списании со счета на величины различные для пополнения и списания и рассчитываемые в зависимости от некоторых значений величин «стоимости» баланса и «стоимости» пополнения. Величины «стоимости» баланса и «стоимости» пополнения являются целочисленными значениями и зависят от типа счета, который может быть, Base, Silver, Gold. Для работы со счетом реализовать следующие возможности:- пополнение на счет;
- списание со счета (для счетов выше Base, возможен списание в кредит, размер кредита зависит от статуса счета);
- перевод суммы с одного счета на другой счет;
- создание нового счета;
- закрытие счета.
Работу типов продемонстрировать на примере консольного приложения.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Link to .cs-file here | Link to NUnit Tests - cs-file here |
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 6. Inheritance Download Example Code
- Chapter 14. Dynamic Typing Download Example Code
- C# 4.0 Unleashed. Bart De Smet. Sams Publishing. 2011
- Chapter 11. Fields, Properties, and Indexers
- Chapter 14. Object-Oriented Programming
- Chapter 22. Dynamic Programming .
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 10. Properties
- Chapter 13. Interfaces
- IEEE-754 Floating Point Converter
- Наглядное объяснение чисел с плавающей запятой
- Взгляд со стороны: Стандарт IEEE754
- Представление вещественных чисел
- Что внутри числа с плавающей точкой и как оно работает
- IEEE 754 - стандарт двоичной арифметики с плавающей точкой
- Pro .NET Performance. Sasha Goldshtein. Chapter 3: Type Internals(Value Type Internals)
-
( - 28.09.2019, 24.00) Реализовать экземплярный класс Transformer, экземплярный метод TransformToWords которого выполняет преобразование любого вешественного (System.Double) числа в его "словестный формат". Разработать модульные тесты. Примерные тест-кейсы
- [TestCase(double.NaN, ExpectedResult = "Not a number")]
- [TestCase(double.NegativeInfinity, ExpectedResult = "Negative infinity")]
- [TestCase(double.PositiveInfinity, ExpectedResult = "Positive infinity")]
- [TestCase(-0.0d, ExpectedResult = "zero")]
- [TestCase(0.0d, ExpectedResult = "zero")]
- [TestCase(0.1d, ExpectedResult = "zero point one")]
- [TestCase(-23.809d, ExpectedResult = "minus two three point eight zero nine")]
- [TestCase(-0.123456789d, ExpectedResult = "minus zero point one two three four five six seven eight nine")]
- [TestCase(1.23333e308d, ExpectedResult = "one point two three three three three E plus three zero eight")]
- [TestCase(double.Epsilon, ExpectedResult = "four point nine four zero six five six four five eight four one two four seven E minus three two four")]
и т.д. для double.MaxValue, double.MaxValue.
Проанализировать полученное решение на предмет возможности его использования для получения "словестного формата" на другом (русском, немецком и т.д.) языке
-
( - 28.09.2019, 24.00) Расширить функциональную возможность типа System.Double, реализовав возможность получения строкового представления вещественного числа в формате IEEE 754. Готовые классы-конверторы не использовать. Разработать модульные тесты. Примерные тест-кейсы (для тестирования специальных значений вещественных чисел возможны варианты).
- [TestCase(-255.255, ExpectedResult = "1100000001101111111010000010100011110101110000101000111101011100")]
- [TestCase(255.255, ExpectedResult = "0100000001101111111010000010100011110101110000101000111101011100")]
- [TestCase(4294967295.0, ExpectedResult = "0100000111101111111111111111111111111111111000000000000000000000")]
- [TestCase(double.MinValue, ExpectedResult = "1111111111101111111111111111111111111111111111111111111111111111")]
- [TestCase(double.MaxValue, ExpectedResult = "0111111111101111111111111111111111111111111111111111111111111111")]
- [TestCase(double.Epsilon, ExpectedResult = "0000000000000000000000000000000000000000000000000000000000000001")]
- [TestCase(double.NaN, ExpectedResult = "1111111111111000000000000000000000000000000000000000000000000000")]
- [TestCase(double.NegativeInfinity, ExpectedResult = "1111111111110000000000000000000000000000000000000000000000000000")]
- [TestCase(double.PositiveInfinity, ExpectedResult = "0111111111110000000000000000000000000000000000000000000000000000")]
- [TestCase(-0.0, ExpectedResult = "1000000000000000000000000000000000000000000000000000000000000000")]
- [TestCase(0.0, ExpectedResult = "0000000000000000000000000000000000000000000000000000000000000000")]
и т.д.
-
( - 30.09.2019, 24.00) Разработать неизменяемый класс Polynomial (полином) для работы с многочленами n-ой степени от одной переменной вещественного типа (в качестве внутренней структуры для хранения коэффициентов использовать sz-массив). Для разработанного класса реализовать протокол эквивалентности по значению, перегрузить операции (включая "==" и "!="), допустимые для работы с многочленами (исключая деление многочлена на многочлен). Разработать модульные тесты для тестирования методов класса.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||
2 | Link to .cs-file here | Link to NUnit Tests - cs-file here | |||
3 | Link to .cs-file here | Link to NUnit Tests - cs-file here |
-
Некто L начал разработку библиотеки (проект Algorithms.V1) для алгебраических вычислений. Согласно требованию библиотека должна быть реализована как статический класс с удобными для использования для различного рода расчетов статическими методами, в частности, методами, реализующими подсчет НОД-а для двух, трех, четырех и т.д. целых чисел алгоритмом Евклида (Стайна), включая возможность подсчета времени вычислений.
Завершите разработку библиотеки, начатой L, добавив недостающий функционал, не изменяя сигнутуры существующих в типах методов.
Какие класс (классы) необходимо будет изменить в случае, если появиться необходимость добавить реализацию еще одного алгоритма Евклида? обоснуйте целесообразность использования подхода, предложенного L, с точки зрения трудозатрат при добавлении такой функциональности.
Подумайте, является ли необходимость подсчета времени ответственностью класса алгоритма.
-
Некто M начал разработку библиотеки (проект Algorithms.V2) для алгебраических вычислений. Согласно требованию библиотека должна предоставлять набор типов с удобными для использования различного рода расчетов методами, в частности, методами, реализующими подсчет НОД-а для двух, трех, четырех и т.д. целых чисел классическим алгоритмом Евклида (Стайна), включая возможность подсчета времени вычислений.
Завершите разработку библиотеки, начатой M, добавив недостающий функционал, не изменяя сигнутуры обозначенных в типах методов и наборы публичных членов предложенных типов. При реализации для обозначенных алгоритмов возможности подсчета НОД-а для трех, четырех и т.д. целых чисел использовать методы расширения. При реализации возможности подсчета времени для обозначенных алгоритмов использовать методы расширения.
Какие класс (классы) необходимо будет изменить в случае, если появиться необходимость добавить реализацию еще одного алгоритма? обоснуйте целесообразность использования подхода, предложенного M, с точки зрения трудозатрат при добавлении такой функциональности.
-
Некто N начал разработку библиотеки (проект Algorithms.V3) для алгебраических вычислений. Согласно требованию библиотека должна предоставлять набор типов с удобными для использования различного рода расчетов методами, в частности, методами, реализующими подсчет НОД-а двух, трех, четырех и т.д. целых чисел классическим алгоритмом Евклида (Стайна), включая возможность подсчета времени вычислений.
Завершите разработку библиотеки, начатой N, добавив недостающий функционал, не изменяя сигнутуры обозначенных в типах методов и наборы публичных членов предложенных типов. Для реализации для обозначенных алгоритмов возможности подсчета НОД-а для трех, четырех и т.д. целых чисел разработать новый класс, который расширяет функциональность исходных, не используя классического наследования. Добавить в полученный класс возможность подсчета времени работы алгоритмов.
Какие класс (классы) необходимо будет изменить в случае, если появиться необходимость добавить реализацию еще одного алгоритма? обоснуйте целесообразность использования подхода, предложенного N, с точки зрения трудозатрат при добавлении такой функциональности.
-
Некто K начал разработку библиотеки (проект Algorithms.V4) для алгебраических вычислений. Согласно требованию библиотека должна предоставлять набор типов с удобными для использования различного рода расчетов методами, в частности, методами, реализующими подсчет НОД-а двух, трех, четырех и т.д. целых чисел классическим алгоритмом Евклида (Стайна), включая возможность подсчета времени вычислений.
Завершите разработку библиотеки, начатой K, добавив недостающий функционал, не изменяя сигнутуры обозначенных в типах методов и наборы публичных членов предложенных типов. Для реализации для обозначенных алгоритмов возможности подсчета НОД-а для трех, четырех и т.д. целых чисел разработать новый класс, который расширяет функциональность исходных, не используя классического наследования. При реализации данного класса учесть возможность замены класса Stopwatch для подсчета времени работы алгоритмов классом обладающим аналогичной функциональностью. Добавить в полученный класс (или к системе типов) возможность логирования исключений, которые могут возникнуть при работе методов, предусмотрев возможность использования различных фреймворков для логирования. Какие класс (классы) необходимо будет изменить в случае, если появиться необходимость добавить реализацию еще одного алгоритма? обоснуйте целесообразность использования подхода, предложенного K, с точки зрения трудозатрат при добавлении такой функциональности.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Algorithms.V1 | NUnit Tests | |||
2 | Algorithms.V2 | NUnit Tests | |||
3 | Algorithms.V3 | NUnit Tests | |||
4 | Algorithms.V4 | Console Client Code |
Step | Task | Solution Status | Solution Link | Additional/Comments |
---|---|---|---|---|
1 | Создание консольного приложения FileCabinetApp | Solution | ||
2 | Создание сервиса FileCabinetService | Solution | ||
3 | Редактирование и валидация данных | Solution | ||
4 | Поиск | Solution | ||
5 | Рефакторинг | Solution | ||
6 | Экспорт в CSV и XML | Solution | ||
7 | Хранилище на файловой системе | Solution | ||
8 | Расширение команды | Solution | ||
9 | Импорт из CSV и XML | Solution | ||
10 | Удаление записей | Solution |
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 4. Generics. Download Example Code
- Chapter 5. Collections. Download Example Code
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 3. Parameterized typing with generics.
- Appendix B. Generic collections in .NET.
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 7. Collections. Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 15. Generic Types and Methods.
- Chapter 16. Collection Types.
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 12. Generics.
- Pro .NET Performance: Optimize Your C# Applications. Sasha Goldshtein.
- Chapter 5. Collections and Generics
- ( - 03.10.2019, 24.00) Создать новый статический класс ArrayExtension, в который поместить код метода FilterArrayByKey Task 4, переименовав метод в Filter и сделав его методом расширения соответствующего массива. Метод должен уметь возвращать только те элемнты исходного массива, которые удовлетворяют определенному условию (предикату). И добавить метод FindMaximumItem Task 2, как метод расширения, переименовать в Max .
- ( - 03.10.2019, 24.00) Добавить в статический класс ArrayExtension (п.1) метод расширения Transform который трансформирует элементы массива вещественных чисел в строку согласно переданному правилу. Проверить работу разработанного метода. В качестве тест-кейсов использовать следующие правила
- получение для вещественного числа его строкового "словесно-цифрового" описания на английском языке;
- получение для вещественного числа его строкового "словесно-цифрового" описания на русском языке;
- получение для вещественного числа его битового строкового предстваления в формате IEEE 754.
Как, не изменяя код класса Transformer Task 1, его можно использовать в качестве правила для трансформации элементов массива в этом методе. Как, не изменяя код класса с методом расширения Task 2, его можно использовать в качестве правила для трансформации элементов массива в этом методе.
- ( - 04.10.2019, 24.00) Добавить в статический класс ArrayExtension метод расширения для массива строк OrderAccordingTo, который возвращает элементы исходного массива в порядке, определенном переданным правилом сравнения. (С индексированием не мудрить! Это будет обычная сортировка с той лишь разницей, что упорядоченный массив будет в качестве возвращаемого значения, а исходный не изменится.)
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests | |||
2 | Solution | NUnit Tests | |||
3 | Solution | NUnit Tests |
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 4. Generics. Download Example Code
- Chapter 5. Collections. Download Example Code
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 3. Parameterized typing with generics.
- Appendix B. Generic collections in .NET.
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 7. Collections. Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 15. Generic Types and Methods.
- Chapter 16. Collection Types.
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 12. Generics.
- Pro .NET Performance: Optimize Your C# Applications. Sasha Goldshtein.
- Chapter 5. Collections and Generics
- ( - 05.10.2019, 24.00) Переобразовать методы расширения класса ArrayExtension Day 8 в обобщенно-типизированные. Убедиться, что все написанные ранее тесты проходят.
- ( - 05.10.2019, 24.00) Добавить в класс с методами рассширения новый обобщенный метод расширения, который получает из массива объектов новый массив, все элементы которого имеют один тип.
- ( - 06.10.2019, 24.00) Реализовать метод-генератор последовательности чисел Фибоначчи. Разработать unit-тесты.
- ( - 05.10.2019, 24.00) Разработать обобщенный типизированный класс-коллекцию
Queue<T>
, реализующий основные операции для работы с очередью, и предоставляющий возможность итерирования по ней. Протестировать методы разработанного класса. - ( - 10.10.2019, 24.00) Заполните таблицу
Collection | Indexed lookup | Keyed lookup | Value lookup | Addition | Removal | Memory |
---|---|---|---|---|---|---|
Списки | ||||||
T[] |
||||||
List<T> |
||||||
LinkedList<T> |
||||||
Collection<T> |
||||||
BindingList<T> |
||||||
ObservableCollection<T> |
||||||
KeyCollection<TKey, TItem> |
||||||
ReadOnlyCollection<T> |
||||||
ReadOnlyObservableCollection<T> |
||||||
Словари | ||||||
Dictionary<TKey, TValue> |
||||||
SortedList<TKey, TValue> |
||||||
SortedDictionary<TKey, TValue> |
||||||
SortedDictionary<TKey,TValue> . |
||||||
ReadOnlyDictionary<TKey, TValue> |
||||||
Множества | ||||||
HashSet<T> |
||||||
SortedSet<T> |
||||||
Очередь, стек | ||||||
Queue<T> |
||||||
Stack<T> |
*
If ... .**
If ... .
Collection | Underlying structure | Lookup strategy | Ordering | Contiguous storage | Data access | Exposes Key & Value collection |
---|---|---|---|---|---|---|
Списки | ||||||
T[] |
||||||
List<T> |
||||||
LinkedList<T> |
||||||
Collection<T> |
||||||
BindingList<T> |
||||||
ObservableCollection<T> |
||||||
KeyCollection<TKey, TItem> |
||||||
ReadOnlyCollection<T> |
||||||
ReadOnlyObservableCollection<T> |
||||||
Словари | ||||||
Dictionary<TKey, TValue> |
||||||
SortedList<TKey, TValue> |
||||||
SortedDictionary<TKey, TValue> |
||||||
ReadOnlyDictionary<TKey, TValue> |
||||||
Множества | ||||||
HashSet<T> |
||||||
SortedSet<T> |
||||||
Очередь, стек | ||||||
Queue<T> |
||||||
Stack<T> |
*
... .**
... .
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests | |||
2 | Solution | NUnit Tests | |||
3 | Solution | NUnit Tests | |||
4 | Solution | NUnit Tests | |||
5 |
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 4. Generics. Download Example Code
- Chapter 5. Collections. Download Example Code
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 3. Parameterized typing with generics.
- Appendix B. Generic collections in .NET.
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 7. Collections. Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 15. Generic Types and Methods.
- Chapter 16. Collection Types.
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 12. Generics.
- Pro .NET Performance: Optimize Your C# Applications. Sasha Goldshtein.
- Chapter 5. Collections and Generics
- ( - 09.10.2019, 24.00) Реализовать метод-генератор последовательности простых чисел. Разработать unit-тесты.
- ( - 09.10.2019, 24.00) Для заданной строки проверить правильность расстановки скобок '(', ')', '[', ']', '{', '}'. Разработать unit-тесты.
- ( - 10.10.2019, 24.00) Для заданной строки выделить все различные слова. Слова, отличающиеся только регистром букв, считать одинаковыми. Разработать unit-тесты.
- ( - 11.10.2019, 24.00) В кругу стоят N человек, пронумерованных от 1 до N. При ведении счета по кругу вычеркивается каждый k-ый человек, пока не останется один. Cмоделировать данный процесс. Разработать unit-тесты.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests | |||
2 | Solution | NUnit Tests | |||
3 | Solution | NUnit Tests | |||
4 | Solution | NUnit Tests |
Использование Moq
-
Создание mock-объекта
Mock<IDependency> mock = new Mock<IDependency>();
-
Добавление метод в mock-объект
mock.Setup(m => m.Calculate(It.IsAny<int>())).Returns<int>(value => value);
Метод | Описание |
---|---|
Is(predicate) | Указывает значения типа T, для которых предикат (predicate) возвратит значение true |
IsAny() | Указывает любое значение типа T |
IsInRange(min, max, kind) | Срабатывает, если параметр находится между определенными значениями типа T. Последний параметр - это значение перечисления Range, которым может быть Inclusive или Exclusive |
IsRegex(regex) | Срабатывает, если строковый параметр дает соответствие с указанным регулярным выражением |
-
Определение результата, который Moq будет возвращать при вызове метода mock-объекта, тип результата задается с помощью параметра типа, а сам результат - посредством лямбда-выражения
.Returns<int>(value => value);
-
Использование имитированного mock-объекта
var comeObject = new SomeClass(mock.Object);
-
Имитация для специфичных значений (и генерация исключения)
mock.Setup(m => m.Calculate(It.Is<int>(v => v == 0))).Throws<System.ArgumentOutOfRangeException>(); mock.Setup(m => m.Calculate(It.Is<int>(v => v > 100))).Returns<int>(value => -value);
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 5. Fast-tracked delegates.
- Chapter 9. Lambda expressions and expression trees.
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 17. Delegates.
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 9. Delegates, Lambdas and Events. Download Example Code
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 5. Fast-tracked delegates.
- Chapter 9. Lambda expressions and expression trees.
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 17. Delegates.
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 9. Delegates, Lambdas and Events. Download Example Code
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- ( - 16.10.2019, 24.00) Workshop
- ( - 16.10.2019, 24.00) Некто L начал разработку библиотеки Algorithms.V5 для алгебраических вычислений. Согласно требованию библиотека должна быть реализована как статический класс с удобными для использования для различного рода расчетов статическими методами, в частности, методами, реализующими подсчет НОД-а для двух, трех, четырех и т.д. целых чисел алгоритмом Евклида (Стайна), включая возможность подсчета времени вычислений. Завершите разработку библиотеки, начатой L, добавив недостающий функционал, не изменяя сигнутуры существующих в типах методов.
Какие класс (классы) необходимо будет изменить в случае, если появиться необходимость добавить реализацию еще одного алгоритма Евклида? Обоснуйте целесообразность использования подхода, предложенного L, с точки зрения трудозатрат при добавлении такой функциональности.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests | |||
2 | Solution | NUnit Tests |
- C# in Depth. Jon Skeet. Manning Publications Co. 2013
- Chapter 11. Query expressions and LINQ to Objects.
- Appendix A. LINQ standard query operators.
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 8. LINQ Queries. Code Listings
- Chapter 9. LINQ Operators. Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 19. Language Integrated Query Essentials.
- Chapter 20. Language Integrated Query Internals
- 101 LINQ Samples
- ( - 17.10.2019, 24.00) Как альтернативу классу EnumerableExtension создать класс Enumerable, в который добавить следующие методы расширения интерфеса
IEnumerable<T>
:
- методы для фильтрации Filter и трансформации Transform последовательности, использующие в качестве параметров соответсвующие версии типа делегат
Func<T>
; - метод SortBy, использующий стратегию сортировки по ключу (сортировка по возрастанию) (не стратегию сравнения двух элементов!);
- метод SortBy, использующий стратегию сравнения двух ключей (сортировка по возрастанию);
- метод CastTo, получающий на основе последовательности нетипизированных элементов типизированную последовательность, при этом в случае невозможности приведения хотя бы одного элемента в последовательности, выбрасывается исключение InvalidCastException;
- метод ForAll, определяющий соответствие всех элементов последовательности заданному предикату;
- метод SortByDescending, использующий стратегию сортировки по ключу (сортировка по убыванию);
- метод SortByDescending, использующий стратегию сравнения двух ключей (сортировка по убыванию);
- метод-генератор Range последовательности count целых чисел, начиная с некоторого целочисленного значения start;
- метод Reverse для получения обратного порядка исходной последовательности;
- метод Count для получения количества элементов последовательности, удовлеворяющих хаданному предикату;
- метод Count для получения количества элементов последовательности.
Проверить работу разработанных методов, используя различные типы данных.
- ( - 20.10.2019, 24.00) Скачать архив LINQ - Sample Queries.zip демонстрационного приложения для изучения LINQ.
- Запустить приложение (папка C#, SampleQueries.sln), изучить основные запросы LINQ to Object - 101 LINQ Query Samples (код находится в классе LinqSamples).
-
Добавить в приложение класс CustomSamples производный от класса SampleHarness, класс декорировать атрибутами
[Title("LINQ Query Samples")]
[Prefix("Linq")] -
Добавить в класс CustomSamples методы, каждый из которых является решением соответствующего пункта задания, методы именовать по шаблону LinqQueryN где N номер задания по порядку (01,02...). Методы декорировать атрибутами
[Category("Category method here...")]`(опционально)
[Title("Title method here...")]
[Description("Description method here...")] -
Проверить результ, запуская приложение и просматривая полученный результат.
# | Task | Solution Status | Solution Link |
---|---|---|---|
1 | Получить список всех клиентов, сумма всех заказов которых превосходит некоторую заданную величину. | Solution | |
2 | Для каждого клиента получить список поставщиков, находящихся в той же стране и том же городе. Задание выполнить, как используя операцию группировки, так и без нее. | Solution | |
3 | Получить список тех клиентов, заказы которых превосходят по сумме заданную величину. | Solution | |
4 | Получить список всех клиентов в отсортированном виде по году, месяцу певого заказа клиента, оборотам клиента (от максимального к минимальному) и имени клиента. | Solution | |
5 | Получить список тех клиентов, у которых указан нецифровой почтовый код или не заполнен регион или в телефоне не указан код оператора (что равнозначно «нет круглых скобок в начале»). | Solution | |
6 | Сгруппировать все продукты по категориям, внутри – по наличию на складе, внутри последней группы - по стоимости. | Solution | |
7 | Сгруппировать все товары по группам «дешевые», «средняя цена», «дорогие», определив границы каждой группы произвольным образом. | Solution | |
8 | Рассчитать среднюю сумму заказа по всем клиентам из данного города и среднее количество заказов, приходящееся на клиента из каждого города. | Solution | |
9 | Cоставить свои запросы (не менее 5) к наборам данных, описанных классами Product, Customer, Supplier, Order. | Solution |
- (** - **) Разработать обобщенный класс-коллекцию BinarySearchTree (бинарное дерево поиска). Предусмотреть возможности использования подключаемого интерфейса для реализации отношения порядка. Реализовать три способа обхода дерева: прямой (preorder), поперечный (inorder), обратный (postorder): для реализации обходов использовать блок-итератор (yield). Протестировать разработанный класс, используя следующие типы:
- System.Int32 (использовать сравнение по умолчанию и подключаемый компаратор);
- System.String (использовать сравнение по умолчанию и подключаемый компаратор);
- пользовательский класс Book, для объектов которого реализовано отношения порядка (использовать сравнение по умолчанию и подключаемый компаратор);
- пользовательскую структуру Point, для объектов которого не реализовано отношения порядка (использовать подключаемый компаратор).
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests |
- Delegates. Lambdas and Events
- Паттерны проетирования на платформе .NET. Сергей Тепляков.Глава 5. Паттерн "Наблюдатель". можно найти здесь
- ( - 24.10.2019, 24.00) Workshop.
- ( - 24.10.2019, 24.00) Метеостанция WeatherStation работает на базе запатентовнного объекта WeatherData, отслеживающего текущие погодные условия (температура (Temperature), влажность (Humidity), атмосферное давление (Pressure)).
- Разработать систему классов для создания текущей сводки (CurrentConditionsReport) и статистики (StatisticReport). Все данные должны обновляться в режиме реального времени, по мере того, как объект WeatherData получает данные последних изменений.
- Предложить два варианта решения (интерфейсы + event).
- Смоделировать работу метеостанции в консольном приложении.
- ( - 24.10.2019, 24.00) Разработать класс для имитации часов с обратным отсчетом (только через event), реализующий возможность по истечении назначенного времени (время ожидания предоставляется классу пользователем) передавать сообщение и дополнительную информацию о событии любому подписавшемуся на событие типу. Продемонстрировать работу класса в консольном приложении.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | Console | |||
2 | Solution | Console | |||
3 | Solution | Console |
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 6. Framework Fundamentals. Code Listing
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 14. Chars, Strings, and Working with Text.
- Юникод и .NET - обязательна к прочтению!
- Referencesource.String
- Особенности строк в .NET - обязательна к прочтению!
- New Recommendations for Using Strings in Microsoft .NET 2.0
- String.Intern делает строки ещё интереснее
- Строки в C# и .NET
- Строки, неизменяемость и персистентность. Невероятные приключения в коде. Перевод блога Эрика Липперта
- StringBuilder прошлое и настоящее - обязательна к прочтению!
- Referencesource.StringBuilder
-
(** - 31.10.2019, 24.00) Реализовать метод, который принимает на вход строку source и количество итераций count (проект StringExtension).
public string Convert(string source, int count)
На каждой итерации метода объединяются нечетные символы строки и переносятся в ее начало, и четные символы, которые переносяться в конец.
Пример (строка «Привет Эпам!»):
1 итерация: «Пие пмрвтЭа!»
2 итерация: «Пепртаи мвЭ!»
...
Результат работы метода – результат склеек символов через count итераций.
При реализации алгоритма учесть, что входная строка может содержать очень большое количество символов, а количество итераций может быть огромным. Оптимизировать код с точки зрения быстродействия и потребления ресурсов.
Проверить аргументы на валидность:
- Запрещается передавать пустые строки, строки из пробелов, null.
- Количество итераций должно быть больше 0.
При нарушении этих условий метод генерирует исключение.
Проверить работу метода с помощью модульных тестов (проект StringExtension.Tests), к предложенным тест кейсам добавить дополнительные.
Проверить возможность работы разработанного метода с большими строками и большим количеством итераций (проект StringExtensionWithFiles), замерить время счета.
- ( - 26.10.2019, 24.00) Для объектов класса Book, у которого есть свойства Title, Author, Year, PublishingHous, Edition, Pages и Price (за основу можно взять класс, разработанный ранее) реализовать возможность строкового представления различного вида. Например, для объекта со значениями Title = "C# in Depth", Author = "Jon Skeet", Year = 2019, PublishingHous = "Manning", Edition = 4, Pages = 900, Price = 40$. могут быть следующие варианты:
- Book record: Jon Skeet, C# in Depth, 2019, "Manning",
- Book record: Jon Skeet, C# in Depth, 2019
- Book record: Jon Skeet, C# in Depth
- Book record: C# in Depth, 2019, "Manning"
- Book record: C# in Depth и т.д.
Разработать модульные тесты.
-
( - 26.10.2019, 24.00) Не изменяя класс Book, добавить для объектов данного класса дополнительную (любую не существующую у класса изначально) возможность форматирования, не предусмотренную классом. Разработать модульные тесты.
-
( - 26.10.2019, 24.00) Реализовать решение задачи Day 6. 26.09.2019. Task 2 в виде дополнительной возможности форматного вывода вещественного числа. Разработать модульные тесты.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | NUnit Tests | |||
2 | Solution | NUnit Tests | |||
3 | Solution | NUnit Tests | |||
4 | Solution | NUnit Tests |
- Pro .NET Performance: Optimize Your C# Applications. Goldshtein, S., Zurbalev, D., Group, S., Flatow, I. Apress. 2012
- Chapter 3. Type Internals. Download Example Code
- Chapter 4. Garbage Collection. Download Example Code
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 8. Basics of Exceptions and Resource Management. Download Example Code
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 12. Disposal and Garbage Collection. Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013
- Chapter 19. Language Integrated Query Essentials.
- Chapter 20. Language Integrated Query Internals
- CLR via C#. Jeffrey Richter. Microsoft Press. 2010
- Chapter 21. The Managed Heap and Garbage Collection.
- Внутреннее устройство .NET Framework — как CLR создает объекты периода выполнения (RU)
- C# 6.0 in a Nutshell. Joseph Albahari, Ben Albahari. O'Reilly Media. 2015.
- Chapter 15. Streams and I/O Code Listings
- C# 5.0 Unleashed. Bart De Smet. Sams Publishing. 2013.
- Chapter 28. Working with I/O
- Programming C# 5.0. Ian Griffiths. O'Reilly Media. 2012.
- Chapter 16. Files and Streams Download Example Code
- Пространство имен System.IO
-
(** - 31.10.2019, 24.00) Разработать класс, предоставляющий следующие функциональные возможности:
- функцию побайтового копирования содержимого одного тествового файла в другой с использованием класса FileStream в качестве потока с резервным хранилищем; функция должна возвращать количество записанных байт;
- функцию побайтового копирования содержимого одного тествового файла в другой с использованием класса MemoryStream в качестве потока с резервным хранилищем; функция должна возвращать количество записанных байт; содержимое потока MemoryStream наполняется массивом байт, полученных на основе текстовой информации из файла-источника с помощью класса StreamReader;
- функцию копирования содержимого одного тествового файла в другой, используя возможности буферизации класса FileStream, функция должна возвращать количество записанных байт;
- функцию копирования содержимого одного тествового файла в другой, используя возможности класса-декоратора потоков BufferedStream, функция должна возвращать количество записанных байт;
- функцию копирования содержимого одного тествового файла в другой с использованием класса MemoryStream в качестве потока с резервным хранилищем; функция должна возвращать количество записанных байт;
- функцию построчного копирования содержимого одного тествового файла в другой, функция должна возвращать количество записанных строк;
- функцию сравнения содержимого исходного и полученного файлов.
Протестировать работу класса для данного текстового SourceText.txt в консоли, обратить внимание на содержимое файлов, полученных при копировании с помощью различных методов класса. Результаты проанализировать.
Проанализировать основные возможности потоков (CanRead, CanSeek, CanTimeout, CanWrite...).
Для выполнения задания использовать следующий проект Streams.zip.
-
(** - 31.10.2019, 24.00) Реализовать функциональность, обозначенную в методах класса StreamTask проекта Streams.2.zip. Проверить работу реализованной функциональности для предлагаемых в проекте тестов.
Task | Solution Status | Solution Link | NUnit Tests Status | NUnit Tests Link | Additional/Comments |
---|---|---|---|---|---|
1 | Solution | Console | |||
2 | Solution | Console |