This commit is contained in:
Alexander 2023-11-23 19:33:30 +03:00
parent fa7bb78ed4
commit 77c602cd9c
12 changed files with 85 additions and 127 deletions

View File

@ -323,10 +323,11 @@ public class ActionState<T>
#region Добавление другого состояния #region Добавление другого состояния
/// <summary> /// <summary>
/// Добавляет другое состояние (например, результат другого действия, который возвращает <see cref="ActionState"/>). /// Добавляет другое состояние (например, результат другого действия, который возвращает &lt;see cref="ActionState"/&gt;).
/// </summary> /// </summary>
/// <typeparam name="T">Тип параметра</typeparam>
/// <param name="state">Запись состояния</param> /// <param name="state">Запись состояния</param>
public void AddState(ActionState state) public void AddState (ActionState<T> state)
{ {
AddErrors(state.Errors); AddErrors(state.Errors);
AddWarnings(state.Warnings); AddWarnings(state.Warnings);

View File

@ -6,4 +6,14 @@
/// Обновлено 2023.11.1 /// Обновлено 2023.11.1
/// * Добавлен класс ActionState без возвращаемого значения /// * Добавлен класс ActionState без возвращаемого значения
/// </summary> /// </summary>
public sealed class ActionState: ActionState<string> { } public sealed class ActionState: ActionState<string>
{
/// <summary>
/// Добавляет другое состояние (например, результат другого действия, который возвращает &lt;see cref="ActionState"/&gt;).
/// </summary>
/// <param name="state">Запись состояния</param>
public void AddState (ActionState state)
{
base.AddState(state);
}
}

View File

@ -3,24 +3,26 @@
/// <summary> /// <summary>
/// Обработчик параметров консоли /// Обработчик параметров консоли
/// </summary> /// </summary>
public sealed class ConsoleParamsParser /// <param name="consoleParams">Параметры консоли</param>
public sealed class ConsoleParamsParser (IEnumerable<string> consoleParams)
{ {
/// <summary> /// <summary>
/// Массив параметров /// Массив параметров
/// </summary> /// </summary>
private readonly List<(string, string?)> _paramsList; private readonly KeyValueList<string, string?> _paramsList = ParseConsoleParams(consoleParams);
/// <summary> /// <summary>
/// Конструктор /// Парсер параметров
/// </summary> /// </summary>
/// <param name="consoleParams">Параметры консоли</param> /// <param name="paramsList">Входящий список параметров</param>
public ConsoleParamsParser (string[] consoleParams) /// <returns></returns>
private static KeyValueList<string, string?> ParseConsoleParams (IEnumerable<string> paramsList)
{ {
//Создаю список параметров //Создаю список параметров
_paramsList = new(); KeyValueList<string, string?> result = new();
//Заполняю его //Заполняю его
foreach (string consoleParam in consoleParams) foreach (string consoleParam in paramsList)
{ {
//Индекс знака "=" //Индекс знака "="
int eqPlace = consoleParam.IndexOf('='); int eqPlace = consoleParam.IndexOf('=');
@ -32,8 +34,11 @@ public sealed class ConsoleParamsParser
string? value = eqPlace == -1 ? null : consoleParam[(eqPlace + 1)..].Trim(new[] { '"' }); string? value = eqPlace == -1 ? null : consoleParam[(eqPlace + 1)..].Trim(new[] { '"' });
//Сохраняю в списке //Сохраняю в списке
_paramsList.Add((param.ToLower(), value)); result.Add(param.ToLower(), value);
} }
// Возвращаю значение
return result;
} }
/// <summary> /// <summary>
@ -42,7 +47,7 @@ public sealed class ConsoleParamsParser
/// <param name="param">Параметр</param> /// <param name="param">Параметр</param>
/// <returns>Есть ли параметр в списке</returns> /// <returns>Есть ли параметр в списке</returns>
public bool HasParam (string param) => public bool HasParam (string param) =>
_paramsList.Any(keyValue => keyValue.Item1 == param.ToLower()); _paramsList.Any(keyValue => keyValue.Key == param.ToLower());
/// <summary> /// <summary>
/// Получает значение параметра /// Получает значение параметра
@ -50,12 +55,12 @@ public sealed class ConsoleParamsParser
/// <param name="param"></param> /// <param name="param"></param>
/// <returns></returns> /// <returns></returns>
public string? GetValue (string param) => public string? GetValue (string param) =>
!HasParam(param) ? null : _paramsList.FirstOrDefault(keyValue => keyValue.Item1 == param.ToLower()).Item2; !HasParam(param) ? null : _paramsList.FirstOrDefault(keyValue => keyValue.Key == param.ToLower()).Value;
/// <summary> /// <summary>
/// Получает список всех параметров /// Получает список всех параметров
/// </summary> /// </summary>
/// <returns>Список всех параметров</returns> /// <returns>Список всех параметров</returns>
public List<string> GetParamsList () => public List<string?> GetParamsList () =>
_paramsList.Select(static keyValue => keyValue.Item1.ToLower()).ToList(); _paramsList.Select(static keyValue => keyValue.Key?.ToLower()).ToList();
} }

View File

@ -3,19 +3,11 @@
/// <summary> /// <summary>
/// Конвертер количества элементов /// Конвертер количества элементов
/// </summary> /// </summary>
public sealed class CountConverter : ValueConverter public sealed class CountConverter (IEnumerable<string> valueNames, byte decimalPlace = 0): ValueConverter(
valueNames, 1000, decimalPlace)
{ {
/// <summary> /// <summary>
/// Имена размеров файлов по умолчанию /// Имена размеров файлов по умолчанию
/// </summary> /// </summary>
public static readonly string[] DefaultNames = {"", "тыс.", "млн."}; public static readonly string[] DefaultNames = { "", "тыс.", "млн." };
/// <summary>
/// Конструктор класса
/// </summary>
/// <param name="valueNames">Массив имён размерностей</param>
/// <param name="decimalPlace">Знаков после запятой (0, 1, 2)</param>
public CountConverter (string[] valueNames, byte decimalPlace = 0) : base(valueNames, 1000, decimalPlace)
{
}
} }

View File

@ -3,19 +3,13 @@
/// <summary> /// <summary>
/// Конвертер размеров файлов /// Конвертер размеров файлов
/// </summary> /// </summary>
public sealed class FileSizeConverter : ValueConverter /// <param name="valueNames">Массив имён размерностей</param>
/// <param name="decimalPlace">Знаков после запятой (0, 1, 2)</param>
public sealed class FileSizeConverter (IEnumerable<string> valueNames, byte decimalPlace = 2): ValueConverter(
valueNames, 1024, decimalPlace)
{ {
/// <summary> /// <summary>
/// Имена размеров файлов по умолчанию /// Имена размеров файлов по умолчанию
/// </summary> /// </summary>
public static readonly string[] DefaultNames = {"байт", "Кб", "Мб", "Гб", "Тб"}; public static readonly string[] DefaultNames = { "байт", "Кб", "Мб", "Гб", "Тб" };
/// <summary>
/// Конструктор класса
/// </summary>
/// <param name="valueNames">Массив имён размерностей</param>
/// <param name="decimalPlace">Знаков после запятой (0, 1, 2)</param>
public FileSizeConverter (string[] valueNames, byte decimalPlace = 2) : base(valueNames, 1024, decimalPlace)
{
}
} }

View File

@ -9,7 +9,7 @@ namespace anbs_cp.Classes;
/// </summary> /// </summary>
/// <typeparam name="TK">Тип ключа</typeparam> /// <typeparam name="TK">Тип ключа</typeparam>
/// <typeparam name="TV">Тип значения</typeparam> /// <typeparam name="TV">Тип значения</typeparam>
public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>> public sealed class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>
{ {
/// <summary> /// <summary>
/// Хранение значений /// Хранение значений
@ -58,7 +58,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>
public void ChangeValue (KeyValue<TK, TV> keyValue) public void ChangeValue (KeyValue<TK, TV> keyValue)
{ {
// Если такой ключ не существует // Если такой ключ не существует
if (!Contains(keyValue.Key!)) if (!Contains(keyValue.Key))
{ {
// - тогда добавляю новое значение // - тогда добавляю новое значение
Add(keyValue); Add(keyValue);
@ -68,7 +68,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>
} }
// Существующее значение // Существующее значение
KeyValue<TK, TV> existValue = GetItem(keyValue.Key!) ?? new(); KeyValue<TK, TV> existValue = GetItem(keyValue.Key) ?? new();
// Удаляем существующее // Удаляем существующее
_list.Remove(existValue); _list.Remove(existValue);
@ -92,6 +92,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>
public KeyValue<TK, TV>? GetItem (TK key) public KeyValue<TK, TV>? GetItem (TK key)
{ {
// Ищем элемент в списке // Ищем элемент в списке
// ReSharper disable once NullableWarningSuppressionIsUsed
foreach (KeyValue<TK, TV> keyValueItem in _list.Where(keyValueItem => keyValueItem.Key!.Equals(key))) foreach (KeyValue<TK, TV> keyValueItem in _list.Where(keyValueItem => keyValueItem.Key!.Equals(key)))
// - возвращаем его при нахождении // - возвращаем его при нахождении
return keyValueItem; return keyValueItem;
@ -143,6 +144,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>
/// </summary> /// </summary>
/// <param name="key">Ключ элемента</param> /// <param name="key">Ключ элемента</param>
/// <returns>Результат проверки</returns> /// <returns>Результат проверки</returns>
// ReSharper disable once NullableWarningSuppressionIsUsed
public bool Contains (TK key) => Keys.Any(keyParam => keyParam!.Equals(key)); public bool Contains (TK key) => Keys.Any(keyParam => keyParam!.Equals(key));
#endregion #endregion

View File

@ -5,36 +5,27 @@ namespace anbs_cp.Classes;
/// <summary> /// <summary>
/// Абстрактный класс конвертера величин для отображения (улучшенный аналог ValueFormatter) /// Абстрактный класс конвертера величин для отображения (улучшенный аналог ValueFormatter)
/// </summary> /// </summary>
public abstract class ValueConverter: IValueConverter /// <param name="valueNames">Массив имён размерностей</param>
/// <param name="divider">Делитель</param>
/// <param name="decimalPlaces">Число знаков после запятой</param>
public abstract class ValueConverter (IEnumerable<string> valueNames, long divider, byte decimalPlaces): IValueConverter
{ {
/// <summary>
/// Конструктор
/// </summary>
/// <param name="valueNames">Массив имён размерностей</param>
/// <param name="divider">Делитель</param>
/// <param name="decimalPlaces">Число знаков после запятой</param>
protected ValueConverter (string[] valueNames, long divider, byte decimalPlaces)
{
ValueNames = valueNames;
Divider = divider;
DecimalPlaces = (byte)(decimalPlaces < 3 ? decimalPlaces : 2);
}
#region Реализация интерфейса #region Реализация интерфейса
/// <summary> /// <summary>
/// Массив имён размерностей /// Массив имён размерностей
/// </summary> /// </summary>
public string[] ValueNames { get; init; } public string[] ValueNames { get; init; } = valueNames.ToArray();
/// <summary> /// <summary>
/// Делитель /// Делитель
/// </summary> /// </summary>
public long Divider { get; init; } public long Divider { get; init; } = divider;
/// <summary> /// <summary>
/// Знаков после запятой (0, 1, 2) /// Знаков после запятой (0, 1, 2)
/// </summary> /// </summary>
public byte DecimalPlaces { get; init; } public byte DecimalPlaces { get; init; } = (byte)(decimalPlaces < 3 ? decimalPlaces : 2);
#endregion #endregion
@ -50,7 +41,8 @@ public abstract class ValueConverter: IValueConverter
(decimal, int) result = DivideIt(value, 0); (decimal, int) result = DivideIt(value, 0);
//Преобразую значение в строку //Преобразую значение в строку
string resultValue = DecimalPlaces switch { string resultValue = DecimalPlaces switch
{
0 => $"{result.Item1:F0}", 0 => $"{result.Item1:F0}",
1 => $"{result.Item1:F1}", 1 => $"{result.Item1:F1}",
_ => $"{result.Item1:F2}" _ => $"{result.Item1:F2}"
@ -81,7 +73,7 @@ public abstract class ValueConverter: IValueConverter
count++; count++;
//... и продолжаем цикл //... и продолжаем цикл
return DivideIt(value / Divider, count); return DivideIt(value / Divider, count);
} }
#endregion #endregion
} }

View File

@ -1,51 +1,35 @@
namespace anbs_cp.Structs; namespace anbs_cp.Structs;
/// <summary> /// <summary>
/// Пара ключ-значение /// Пара ключ-значение
/// </summary> /// </summary>
/// <typeparam name="TK">Тип ключа</typeparam> /// <typeparam name="TK">Тип ключа</typeparam>
/// <typeparam name="TV">Тип значения</typeparam> /// <typeparam name="TV">Тип значения</typeparam>
public struct KeyValue<TK, TV> /// <param name="key">Ключ</param>
/// <param name="value">Значение</param>
public struct KeyValue<TK, TV>(TK key, TV? value)
{ {
#region Конструкторы
/// <summary>
/// Конструктор по умолчанию
/// </summary>
public KeyValue ()
{
Key = default;
Value = default;
}
/// <summary>
/// Конструктор со значениями
/// </summary>
/// <param name="key">Ключ</param>
/// <param name="value">Значение</param>
public KeyValue (TK key, TV value)
{
Key = key;
Value = value;
}
#endregion
#region Свойства #region Свойства
/// <summary>
/// Ключ
/// </summary>
public TK? Key { get; set; }
/// <summary> /// <summary>
/// Значение /// Ключ
/// </summary> /// </summary>
public TV? Value { get; set; } public TK Key { get; set; } = key;
/// <summary>
/// Значение
/// </summary>
public TV? Value { get; set; } = value;
#endregion #endregion
#region Методы #region Методы
/// <summary> /// <summary>
/// Получает ключ-значение по умолчанию /// Получает ключ-значение по умолчанию
/// </summary> /// </summary>
/// <returns>Ключ-значение по умолчанию</returns> /// <returns>Ключ-значение по умолчанию</returns>
public static KeyValue<TK, TV> GetDefault() => new(); public static KeyValue<TK, TV> GetDefault() => new();
#endregion #endregion
} }

View File

@ -3,40 +3,20 @@
/// <summary> /// <summary>
/// Двумерный размер /// Двумерный размер
/// </summary> /// </summary>
public struct TwoDimSize /// <param name="width">Длина</param>
/// <param name="height">Высота</param>
public struct TwoDimSize (int width = 0, int height = 0)
{ {
#region Приватные поля #region Приватные поля
/// <summary> /// <summary>
/// Длина (приватное) /// Длина (приватное)
/// </summary> /// </summary>
private int _pWidth; private int _pWidth = width;
/// <summary> /// <summary>
/// Высота (приватное) /// Высота (приватное)
/// </summary> /// </summary>
private int _pHeight; private int _pHeight = height;
#endregion
#region Конструкторы
/// <summary>
/// Конструктор по умолчанию
/// </summary>
public TwoDimSize ()
{
Width = 0;
Height = 0;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="width">Длина</param>
/// <param name="height">Высота</param>
public TwoDimSize (int width, int height)
{
Width = width;
Height = height;
}
#endregion #endregion
#region Свойства #region Свойства

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<Version>2023.1115.0</Version> <Version>2023.1123.0</Version>
<Authors>Александр Бабаев</Authors> <Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software</Product> <Product>Набор компонентов ANB Software</Product>
<Description>Библиотека полезных методов языка C#</Description> <Description>Библиотека полезных методов языка C#</Description>

View File

@ -6,18 +6,16 @@ using MySqlConnector;
namespace anbs_cp.Database.Classes; namespace anbs_cp.Database.Classes;
public class MySqlEngine: IDbEngine /// <summary>
/// База данных MySQL
/// </summary>
/// <param name="connectionString">Строка подключения базы данных</param>
public class MySqlEngine (string connectionString): IDbEngine
{ {
/// <summary>
/// Конструктор
/// </summary>
/// <param name="connectionString">Строка подключения базы данных</param>
public MySqlEngine (string connectionString) => ConnectionString = connectionString;
/// <summary> /// <summary>
/// Строка подключения базы данных /// Строка подключения базы данных
/// </summary> /// </summary>
public string ConnectionString { get; set; } public string ConnectionString { get; set; } = connectionString;
#region Базовые операции #region Базовые операции
/// <summary> /// <summary>

View File

@ -8,7 +8,7 @@
<RootNamespace>anbs_cp.Database</RootNamespace> <RootNamespace>anbs_cp.Database</RootNamespace>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild> <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>ANBSoftware.ComponentsPack.Database</PackageId> <PackageId>ANBSoftware.ComponentsPack.Database</PackageId>
<Version>2023.11.14.0</Version> <Version>2023.11.23.0</Version>
<Company>Александр Бабаев</Company> <Company>Александр Бабаев</Company>
<Product>Набор компонентов ANB Software для работы с БД</Product> <Product>Набор компонентов ANB Software для работы с БД</Product>
<Description>Библиотека полезных методов языка C# для работы с базами данных</Description> <Description>Библиотека полезных методов языка C# для работы с базами данных</Description>
@ -19,8 +19,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.21" /> <PackageReference Include="Dapper" Version="2.1.24" />
<PackageReference Include="MySqlConnector" Version="2.3.0" /> <PackageReference Include="MySqlConnector" Version="2.3.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>