20250420
This commit is contained in:
@@ -4,36 +4,44 @@
|
||||
/// Обработчик параметров консоли
|
||||
/// </summary>
|
||||
/// <param name="consoleParams">Параметры консоли</param>
|
||||
public sealed class ConsoleParamsParser (IEnumerable<string> consoleParams)
|
||||
/// <param name="caseSensitive">Регистрозависимые ли параметры</param>
|
||||
public sealed class ConsoleParamsParser(IEnumerable<string> consoleParams, bool caseSensitive = true)
|
||||
{
|
||||
/// <summary>
|
||||
/// Массив параметров
|
||||
/// </summary>
|
||||
private readonly KeyValueList<string, string?> _paramsList = ParseConsoleParams(consoleParams);
|
||||
private readonly KeyValueList<string, string?> _paramsList = ParseConsoleParams(consoleParams, caseSensitive);
|
||||
|
||||
/// <summary>
|
||||
/// Парсер параметров
|
||||
/// </summary>
|
||||
/// <param name="paramsList">Входящий список параметров</param>
|
||||
/// <returns></returns>
|
||||
private static KeyValueList<string, string?> ParseConsoleParams (IEnumerable<string> paramsList)
|
||||
/// <param name="caseSensitive">Регистрозависимые ли параметры</param>
|
||||
/// <returns>Список параметров</returns>
|
||||
private static KeyValueList<string, string?> ParseConsoleParams(IEnumerable<string> paramsList,
|
||||
bool caseSensitive = true)
|
||||
{
|
||||
//Создаю список параметров
|
||||
// Создаю список параметров
|
||||
KeyValueList<string, string?> result = [];
|
||||
|
||||
//Заполняю его
|
||||
// Заполняю его
|
||||
foreach (string consoleParam in paramsList)
|
||||
{
|
||||
//Индекс знака "="
|
||||
// Индекс знака "="
|
||||
int eqPlace = consoleParam.IndexOf('=');
|
||||
|
||||
//Получаю параметр
|
||||
// Получаю параметр
|
||||
string param = eqPlace > -1 ? consoleParam[..eqPlace] : consoleParam;
|
||||
|
||||
//Получаю значение параметра
|
||||
string? value = eqPlace == -1 ? null : consoleParam[(eqPlace + 1)..].Trim(new[] { '"' });
|
||||
// Проверяю, требуются ли регистрозависимые параметры
|
||||
if (!caseSensitive)
|
||||
// - если нет, то переводим в нижний регистр
|
||||
param = param.ToLower();
|
||||
|
||||
//Сохраняю в списке
|
||||
// Получаю значение параметра
|
||||
string? value = eqPlace == -1 ? null : consoleParam[(eqPlace + 1)..].Trim(['"']);
|
||||
|
||||
// Сохраняю в списке
|
||||
result.Add(param.ToLower(), value);
|
||||
}
|
||||
|
||||
@@ -46,21 +54,76 @@ public sealed class ConsoleParamsParser (IEnumerable<string> consoleParams)
|
||||
/// </summary>
|
||||
/// <param name="param">Параметр</param>
|
||||
/// <returns>Есть ли параметр в списке</returns>
|
||||
public bool HasParam (string param) =>
|
||||
_paramsList.Any(keyValue => keyValue.Key == param.ToLower());
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public bool HasParam(string param)
|
||||
{
|
||||
// Проверяю регистрозависимость
|
||||
if (!caseSensitive)
|
||||
// - если нет, то переводим в нижний регистр
|
||||
param = param.ToLower();
|
||||
|
||||
// Проверяю наличие параметра
|
||||
return _paramsList.Any(keyValue => keyValue.Key == param.ToLower());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение параметра
|
||||
/// Проверяет наличие параметров
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <returns></returns>
|
||||
public string? GetValue (string param) =>
|
||||
!HasParam(param) ? null : _paramsList.FirstOrDefault(keyValue => keyValue.Key == param.ToLower()).Value;
|
||||
/// <param name="params">Массив параметров</param>
|
||||
/// <returns>Задан ли хотя бы один параметр</returns>
|
||||
public bool HasParams(IEnumerable<string> @params) =>
|
||||
@params.Aggregate(false, (current, param) => current || HasParam(param));
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение параметра,
|
||||
/// </summary>
|
||||
/// <param name="param">Имя параметра</param>
|
||||
/// <param name="default">Значение по умолчанию</param>
|
||||
/// <returns>Значение параметра или значение по умолчанию</returns>
|
||||
public string GetValue(string param, string @default = "") =>
|
||||
!HasParam(param)
|
||||
? @default
|
||||
: _paramsList.FirstOrDefault(keyValue => keyValue.Key == param.ToLower()).Value ?? @default;
|
||||
|
||||
/// <summary>
|
||||
/// Получает значения параметров из списка.
|
||||
/// </summary>
|
||||
/// <param name="params">Список параметров</param>
|
||||
/// <returns>Список значений параметров</returns>
|
||||
public IEnumerable<string> GetValue(IEnumerable<string> @params)
|
||||
{
|
||||
// Задаю результат
|
||||
List<string> result = [];
|
||||
|
||||
// Получаю список параметров
|
||||
List<string> paramsList = @params.ToList();
|
||||
|
||||
// Проверяю наличие параметров
|
||||
if (!HasParams(paramsList))
|
||||
// - если нет, возвращаю значение по умолчанию
|
||||
return [];
|
||||
|
||||
// Для каждого параметра, если задано значение - добавляю его в результат
|
||||
result.AddRange(paramsList.Where(HasParam).Select(param => GetValue(param))
|
||||
.Where(value => !string.IsNullOrWhiteSpace(value)));
|
||||
|
||||
// Возвращаю результат
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение первого заданного параметра и возвращает значение по умолчанию, если ни один из параметров не задан.
|
||||
/// </summary>
|
||||
/// <param name="params">Список параметров</param>
|
||||
/// <param name="default">Значение по умолчанию</param>
|
||||
/// <returns>Значение первого заданного параметра из списка или значение по умолчанию</returns>
|
||||
public string GetValue(IEnumerable<string> @params, string @default) =>
|
||||
GetValue(@params).FirstOrDefault() ?? @default;
|
||||
|
||||
/// <summary>
|
||||
/// Получает список всех параметров
|
||||
/// </summary>
|
||||
/// <returns>Список всех параметров</returns>
|
||||
public List<string> GetParamsList () =>
|
||||
public List<string> GetParamsList() =>
|
||||
_paramsList.Select(static keyValue => keyValue.Key.ToLower()).ToList();
|
||||
}
|
@@ -26,7 +26,6 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
#endregion
|
||||
|
||||
#region Методы
|
||||
|
||||
/// <summary>
|
||||
/// Получает список ключей
|
||||
/// </summary>
|
||||
@@ -37,25 +36,43 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
/// Добавляет в список параметр
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Параметр</param>
|
||||
public void Add (KeyValue<TK, TV> keyValue) => _list.Add(keyValue);
|
||||
public void Add (KeyValue<TK, TV> keyValue)
|
||||
{
|
||||
// Проверяет, существует ли ключ в списке
|
||||
if (Contains(keyValue.Key))
|
||||
ChangeValue(keyValue);
|
||||
|
||||
// Добавляем в список
|
||||
_list.Add(keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Добавляет в список параметр
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ параметра</param>
|
||||
/// <param name="value">Значение</param>
|
||||
public void Add (TK key, TV value) => _list.Add(new(key, value));
|
||||
public void Add (TK key, TV value) => Add(new(key, value));
|
||||
|
||||
/// <summary>
|
||||
/// Добавляет в список некоторый набор элементов
|
||||
/// </summary>
|
||||
/// <param name="list">Некоторый набор элементов</param>
|
||||
public void AddRange (IEnumerable<KeyValue<TK, TV>> list) => _list.AddRange(list);
|
||||
public void AddRange (IEnumerable<KeyValue<TK, TV>> list)
|
||||
{
|
||||
// Получаю список
|
||||
List<KeyValue<TK, TV>> keyValues = list.ToList();
|
||||
|
||||
// Для каждого элемента списка
|
||||
foreach (KeyValue<TK, TV> keyValue in keyValues)
|
||||
// - добавляю его в список
|
||||
Add(keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Изменяет значение
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Новое значение</param>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public void ChangeValue (KeyValue<TK, TV> keyValue)
|
||||
{
|
||||
// Если такой ключ не существует
|
||||
@@ -90,6 +107,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <returns>Элемент <see cref="KeyValue{TK,TV}"/></returns>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public KeyValue<TK, TV>? GetItem (TK key)
|
||||
{
|
||||
// Ищем элемент в списке
|
||||
@@ -125,6 +143,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
/// Удаляет элемент из списка
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Элемент</param>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public void Remove (KeyValue<TK, TV> keyValue) => _list.Remove(keyValue);
|
||||
|
||||
/// <summary>
|
||||
@@ -138,6 +157,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Элемент</param>
|
||||
/// <returns>Результат проверки</returns>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public bool Contains (KeyValue<TK, TV> keyValue) => _list.Contains(keyValue);
|
||||
|
||||
/// <summary>
|
||||
@@ -146,6 +166,7 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
/// <param name="key">Ключ элемента</param>
|
||||
/// <returns>Результат проверки</returns>
|
||||
// ReSharper disable once NullableWarningSuppressionIsUsed
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public bool Contains (TK key) => Keys.Any(keyParam => keyParam!.Equals(key));
|
||||
|
||||
/// <summary>
|
||||
@@ -184,14 +205,14 @@ public class KeyValueList<TK, TV>: IEnumerable<KeyValue<TK, TV>>, ISerializable
|
||||
result.AddRange(_list.Select(static item => item.Serialize()));
|
||||
|
||||
// Вывожу результат
|
||||
return new SysTextSerializer().Serialize(result);
|
||||
return new NewtonsoftJsonSerializer().Serialize(result);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Deserialize (string json)
|
||||
{
|
||||
// Создаю результат
|
||||
List<string> result = new SysTextSerializer().Deserialize<List<string>>(json) ?? [];
|
||||
List<string> result = new NewtonsoftJsonSerializer().Deserialize<List<string>>(json) ?? [];
|
||||
|
||||
// Очищаю список
|
||||
_list.Clear();
|
||||
|
222
anbs_cp/Classes/KeyValueOrderedList.cs
Normal file
222
anbs_cp/Classes/KeyValueOrderedList.cs
Normal file
@@ -0,0 +1,222 @@
|
||||
using System.Collections;
|
||||
|
||||
using anbs_cp.Interfaces;
|
||||
using anbs_cp.Structs;
|
||||
|
||||
namespace anbs_cp.Classes;
|
||||
|
||||
/// <summary>
|
||||
/// Упорядоченный список из пары ключ-значение
|
||||
/// </summary>
|
||||
/// <typeparam name="TV">Тип значения</typeparam>
|
||||
// ReSharper disable once ClassCanBeSealed.Global
|
||||
public class KeyValueOrderedList<TV>: IEnumerable<KeyValueOrdered<TV>>, ISerializable
|
||||
{
|
||||
/// <summary>
|
||||
/// Хранение значений
|
||||
/// </summary>
|
||||
private readonly SortedSet<KeyValueOrdered<TV>> _list = [];
|
||||
|
||||
#region Свойства
|
||||
/// <summary>
|
||||
/// Список ключей из списка
|
||||
/// </summary>
|
||||
public IEnumerable<string> Keys => GetKeys();
|
||||
#endregion
|
||||
|
||||
#region Методы
|
||||
/// <summary>
|
||||
/// Получает список ключей
|
||||
/// </summary>
|
||||
/// <returns>Список ключей</returns>
|
||||
private IEnumerable<string> GetKeys () => from keyValue in _list where keyValue.Key is not null select keyValue.Key;
|
||||
|
||||
/// <summary>
|
||||
/// Добавляет в список параметр
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Параметр</param>
|
||||
public void Add (KeyValueOrdered<TV> keyValue)
|
||||
{
|
||||
// Проверяет, существует ли ключ в списке
|
||||
if (Contains(keyValue.Key))
|
||||
ChangeValue(keyValue);
|
||||
|
||||
// Добавляем в список
|
||||
_list.Add(keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Добавляет в список параметр
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ параметра</param>
|
||||
/// <param name="value">Значение</param>
|
||||
public void Add (string key, TV value) => Add(new(key, value));
|
||||
|
||||
/// <summary>
|
||||
/// Добавляет в список некоторый набор элементов
|
||||
/// </summary>
|
||||
/// <param name="list">Некоторый набор элементов</param>
|
||||
public void AddRange (IEnumerable<KeyValueOrdered<TV>> list)
|
||||
{
|
||||
// Получаю список
|
||||
List<KeyValueOrdered<TV>> keyValues = list.ToList();
|
||||
|
||||
// Для каждого элемента списка
|
||||
foreach (KeyValueOrdered<TV> keyValue in keyValues)
|
||||
// - добавляю его в список
|
||||
Add(keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Изменяет значение
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Новое значение</param>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public void ChangeValue (KeyValueOrdered<TV> keyValue)
|
||||
{
|
||||
// Если такой ключ не существует
|
||||
if (!Contains(keyValue.Key))
|
||||
{
|
||||
// - тогда добавляю новое значение
|
||||
Add(keyValue);
|
||||
|
||||
// - прерываю
|
||||
return;
|
||||
}
|
||||
|
||||
// Удаляем существующее
|
||||
_list.RemoveWhere(item => item.Key == keyValue.Key);
|
||||
|
||||
// Добавляем новое
|
||||
_list.Add(keyValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Изменяет значение
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <param name="newValue">Новое значение</param>
|
||||
public void ChangeValue (string key, TV newValue) => ChangeValue(new(key, newValue));
|
||||
|
||||
/// <summary>
|
||||
/// Получает элемент по ключу
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <returns>Элемент <see cref="KeyValue{TK,TV}"/></returns>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public KeyValueOrdered<TV>? GetItem (string key)
|
||||
{
|
||||
// Ищем элемент в списке
|
||||
foreach (KeyValueOrdered<TV> keyValueItem in _list.Where(item => item.Key == key))
|
||||
// - возвращаем его при нахождении
|
||||
return keyValueItem;
|
||||
|
||||
// Элемент не найден -- вывожу null
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получает значение
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <returns>Значение</returns>
|
||||
public TV? GetValue (string key)
|
||||
{
|
||||
// Если такой ключ не существует
|
||||
if (!Contains(key))
|
||||
// Тогда возвращаю значение по умолчанию
|
||||
return default;
|
||||
|
||||
// Получаю элемент
|
||||
KeyValueOrdered<TV> keyValue = GetItem(key) ?? new();
|
||||
|
||||
// Вывожу значение
|
||||
return keyValue.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Удаляет элемент из списка
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Элемент</param>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public void Remove (KeyValueOrdered<TV> keyValue) => _list.Remove(keyValue);
|
||||
|
||||
/// <summary>
|
||||
/// Удаляет элемент из списка
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ элемента</param>
|
||||
public void Remove (string key) => Remove(GetItem(key) ?? new());
|
||||
|
||||
/// <summary>
|
||||
/// Проверяет, содержится ли элемент в списке
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Элемент</param>
|
||||
/// <returns>Результат проверки</returns>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public bool Contains (KeyValueOrdered<TV> keyValue) => _list.Contains(keyValue);
|
||||
|
||||
/// <summary>
|
||||
/// Проверяет, содержится ли элемент в списке
|
||||
/// </summary>
|
||||
/// <param name="key">Ключ элемента</param>
|
||||
/// <returns>Результат проверки</returns>
|
||||
// ReSharper disable once NullableWarningSuppressionIsUsed
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public bool Contains (string key) => Keys.Any(keyName => keyName == key);
|
||||
|
||||
/// <summary>
|
||||
/// Очистка списка
|
||||
/// </summary>
|
||||
public void Clear ()
|
||||
{
|
||||
// Очищаю список
|
||||
_list.Clear();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса IEnumerable<KeyValue<TK, TV>>
|
||||
/// <inheritdoc />
|
||||
public IEnumerator<KeyValueOrdered<TV>> GetEnumerator () => _list.GetEnumerator();
|
||||
|
||||
/// <inheritdoc />
|
||||
IEnumerator IEnumerable.GetEnumerator () => GetEnumerator();
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
/// <inheritdoc />
|
||||
public string Serialize ()
|
||||
{
|
||||
// Создаю результат
|
||||
List<string> result = [];
|
||||
|
||||
// Добавляю сериализованные значения
|
||||
result.AddRange(_list.Select(static item => item.Serialize()));
|
||||
|
||||
// Вывожу результат
|
||||
return new NewtonsoftJsonSerializer().Serialize(result);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Deserialize (string json)
|
||||
{
|
||||
// Создаю результат
|
||||
List<string> result = new NewtonsoftJsonSerializer().Deserialize<List<string>>(json) ?? [];
|
||||
|
||||
// Очищаю список
|
||||
_list.Clear();
|
||||
|
||||
// Пробегаю все значения
|
||||
foreach (string itemString in result)
|
||||
{
|
||||
// - создаю новое значение
|
||||
KeyValueOrdered<TV> item = new();
|
||||
|
||||
// - десериализую в него элемента
|
||||
item.Deserialize(itemString);
|
||||
|
||||
// - добавляю получившееся в список
|
||||
_list.Add(item);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
@@ -32,7 +32,7 @@ public static class LikeDelphi
|
||||
/// <param name="str">Строка, которую нужно разбить</param>
|
||||
/// <param name="delimiter">Символ-делитель строки</param>
|
||||
/// <returns>Массив строк</returns>
|
||||
public static List<string> ParseString (string str, char delimiter) => str.Split(delimiter).ToList();
|
||||
public static List<string> ParseString (string str, char delimiter) => [.. str.Split(delimiter)];
|
||||
|
||||
/// <summary>
|
||||
/// Переименовываю файл
|
||||
|
Reference in New Issue
Block a user