20250420
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
using anbs_cp.Classes;
|
||||
using anbs_cp.Enums;
|
||||
using anbs_cp.Exceptions;
|
||||
|
||||
using ISerializable = anbs_cp.Interfaces.ISerializable;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Structs;
|
||||
|
||||
@@ -11,21 +10,22 @@ namespace anbs_cp.Structs;
|
||||
/// </summary>
|
||||
/// <typeparam name="TK">Тип ключа</typeparam>
|
||||
/// <typeparam name="TV">Тип значения</typeparam>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <param name="value">Значение</param>
|
||||
public struct KeyValue<TK, TV> (TK key, TV? value): ISerializable
|
||||
/// <param name="Key">Ключ</param>
|
||||
/// <param name="Value">Значение</param>
|
||||
public record struct KeyValue<TK, TV> (TK Key, TV? Value): ISerializable
|
||||
{
|
||||
#region Свойства
|
||||
|
||||
/// <summary>
|
||||
/// Ключ
|
||||
/// </summary>
|
||||
public TK Key { get; set; } = key;
|
||||
public TK Key { get; private set; } = Key;
|
||||
|
||||
/// <summary>
|
||||
/// Значение
|
||||
/// </summary>
|
||||
public TV? Value { get; set; } = value;
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public TV? Value { get; set; } = Value;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -40,17 +40,18 @@ public struct KeyValue<TK, TV> (TK key, TV? value): ISerializable
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
|
||||
/// <inheritdoc />
|
||||
public readonly string Serialize ()
|
||||
{
|
||||
// Получаю serialized-значение ключа
|
||||
string keySerialized = new SysTextSerializer().Serialize(Key);
|
||||
string keySerialized = new NewtonsoftJsonSerializer().Serialize(Key);
|
||||
|
||||
// Исключаю из этого значения = (заменяя на %EQ%)
|
||||
keySerialized = keySerialized.Replace("=", "%EQ%");
|
||||
|
||||
// Получаю serialized-значение значения
|
||||
string valueSerialized = new SysTextSerializer().Serialize(Value);
|
||||
string valueSerialized = new NewtonsoftJsonSerializer().Serialize(Value);
|
||||
|
||||
// Исключаю из этого значения = (заменяя на %EQ%)
|
||||
valueSerialized = valueSerialized.Replace("=", "%EQ%");
|
||||
@@ -71,16 +72,16 @@ public struct KeyValue<TK, TV> (TK key, TV? value): ISerializable
|
||||
"Неверное количество частей! Наверное, лишнее =?");
|
||||
|
||||
// Получаю сериализованное представление ключа
|
||||
string keySerialized = splited[0].Replace("%EQ%", "=");
|
||||
string keySerialized = splited[0].Replace("%EQ%", "=");
|
||||
|
||||
// Получаю сериализованное представление значения
|
||||
// Получаю сериализованное представление значения
|
||||
string valueSerialized = splited[1].Replace("%EQ%", "=");
|
||||
|
||||
// Десериализую ключ
|
||||
Key = (new SysTextSerializer().Deserialize<TK>(keySerialized) ?? default(TK))!;
|
||||
Key = (new NewtonsoftJsonSerializer().Deserialize<TK>(keySerialized) ?? default(TK))!;
|
||||
|
||||
// Десериализую значение
|
||||
Value = new SysTextSerializer().Deserialize<TV>(valueSerialized);
|
||||
Value = new NewtonsoftJsonSerializer().Deserialize<TV>(valueSerialized);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
106
anbs_cp/Structs/KeyValueOrdered.cs
Normal file
106
anbs_cp/Structs/KeyValueOrdered.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
using anbs_cp.Classes;
|
||||
using anbs_cp.Enums;
|
||||
using anbs_cp.Exceptions;
|
||||
using anbs_cp.Interfaces;
|
||||
|
||||
namespace anbs_cp.Structs;
|
||||
|
||||
/// <summary>
|
||||
/// Упорядоченная пара ключ-значение
|
||||
/// </summary>
|
||||
/// <typeparam name="TValue">Тип значения</typeparam>
|
||||
/// <param name="key">Ключ</param>
|
||||
/// <param name="value">Значение</param>
|
||||
public struct KeyValueOrdered<TValue> (string key, TValue? value): ISerializable, IComparable<KeyValueOrdered<TValue>>
|
||||
{
|
||||
#region Свойства
|
||||
/// <summary>
|
||||
/// Ключ
|
||||
/// </summary>
|
||||
public string Key { get; private set; } = key;
|
||||
|
||||
/// <summary>
|
||||
/// Значение
|
||||
/// </summary>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
public TValue? Value { get; set; } = value;
|
||||
#endregion
|
||||
|
||||
#region Методы
|
||||
/// <summary>
|
||||
/// Получает ключ-значение по умолчанию
|
||||
/// </summary>
|
||||
/// <returns>Ключ-значение по умолчанию</returns>
|
||||
public static KeyValueOrdered<TValue> GetDefault () => new();
|
||||
#endregion
|
||||
|
||||
#region Конвертация в KeyValue<TKey, TValue>
|
||||
/// <summary>
|
||||
/// Переводит тип <see cref="KeyValueOrdered{TValue}"/> в тип <see cref="KeyValue{TK,TV}"/>
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Тип <see cref="KeyValueOrdered{TValue}"/></param>
|
||||
/// <returns>Тип <see cref="KeyValue{TK,TV}"/></returns>
|
||||
public static KeyValue<string, TValue> ToKeyValue (KeyValueOrdered<TValue> keyValue) =>
|
||||
new(keyValue.Key, keyValue.Value);
|
||||
|
||||
/// <summary>
|
||||
/// Переводит тип <see cref="KeyValue{TK,TV}"/> в тип <see cref="KeyValueOrdered{TValue}"/>
|
||||
/// </summary>
|
||||
/// <param name="keyValue">Тип <see cref="KeyValue{TK,TV}"/></param>
|
||||
/// <returns>Тип <see cref="KeyValueOrdered{TValue}"/></returns>
|
||||
public static KeyValueOrdered<TValue> ToOrderedKeyValue (KeyValue<string, TValue> keyValue) =>
|
||||
new(keyValue.Key, keyValue.Value);
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса ISerializable
|
||||
/// <inheritdoc />
|
||||
public readonly string Serialize ()
|
||||
{
|
||||
// Получаю serialized-значение ключа
|
||||
string keySerialized = Key;
|
||||
|
||||
// Исключаю из этого значения = (заменяя на %EQ%)
|
||||
keySerialized = keySerialized.Replace("=", "%EQ%");
|
||||
|
||||
// Получаю serialized-значение значения
|
||||
string valueSerialized = new NewtonsoftJsonSerializer().Serialize(Value);
|
||||
|
||||
// Исключаю из этого значения = (заменяя на %EQ%)
|
||||
valueSerialized = valueSerialized.Replace("=", "%EQ%");
|
||||
|
||||
// Вывожу результат
|
||||
return $"{keySerialized}={valueSerialized}";
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Deserialize (string json)
|
||||
{
|
||||
// Разделяю сериализованную строку вида КЛЮЧ=ЗНАЧЕНИЕ на ключ и значение
|
||||
string[] splited = json.Split('=');
|
||||
|
||||
// Проверяю количество частей (должно быть 2)
|
||||
if (splited.Length != 2)
|
||||
throw new SerializeException(ESerializeExceptionAction.Deserialize, json,
|
||||
"Неверное количество частей! Наверное, лишнее =?");
|
||||
|
||||
// Получаю сериализованное представление ключа
|
||||
string keySerialized = splited[0].Replace("%EQ%", "=");
|
||||
|
||||
// Получаю сериализованное представление значения
|
||||
string valueSerialized = splited[1].Replace("%EQ%", "=");
|
||||
|
||||
// Десериализую ключ
|
||||
Key = keySerialized;
|
||||
|
||||
// Десериализую значение
|
||||
Value = new NewtonsoftJsonSerializer().Deserialize<TValue>(valueSerialized);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Реализация интерфейса IComparable<KeyValueOrdered<TValue>>
|
||||
/// <inheritdoc />
|
||||
public int CompareTo (KeyValueOrdered<TValue> other) =>
|
||||
// ReSharper disable once SuspiciousTypeConversion.Global
|
||||
string.Compare(Key, other.Key, StringComparison.CurrentCultureIgnoreCase);
|
||||
#endregion
|
||||
}
|
Reference in New Issue
Block a user