From cfd8af537fe7e1b0869e5ae903002df9971e0097 Mon Sep 17 00:00:00 2001 From: "jozsef.b@aycode.com" <9Rj@D}fVwBaN> Date: Sun, 2 Jun 2024 10:48:37 +0200 Subject: [PATCH] improvemets, fixes, etc... --- AyCode.Core/Enums/DataChangeMode.cs | 15 +++ .../Extensions/CollectionExtensions.cs | 94 +++++++++++++++++++ AyCode.Core/Interfaces/IId.cs | 13 +++ .../Addresses/IAcAddressForeignKey.cs | 6 +- AyCode.Interfaces/Entities/IEntity.cs | 4 +- AyCode.Interfaces/Users/IAcUsersRelation.cs | 4 +- 6 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 AyCode.Core/Enums/DataChangeMode.cs create mode 100644 AyCode.Core/Extensions/CollectionExtensions.cs create mode 100644 AyCode.Core/Interfaces/IId.cs diff --git a/AyCode.Core/Enums/DataChangeMode.cs b/AyCode.Core/Enums/DataChangeMode.cs new file mode 100644 index 0000000..7e7a459 --- /dev/null +++ b/AyCode.Core/Enums/DataChangeMode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AyCode.Core.Enums +{ + public enum DataChangeMode + { + Add = 1, + Update = 2, + Remove = 3, + } +} diff --git a/AyCode.Core/Extensions/CollectionExtensions.cs b/AyCode.Core/Extensions/CollectionExtensions.cs new file mode 100644 index 0000000..731f955 --- /dev/null +++ b/AyCode.Core/Extensions/CollectionExtensions.cs @@ -0,0 +1,94 @@ +using AyCode.Core.Enums; +using AyCode.Core.Interfaces; +using AyCode.Utils.Extensions; + +namespace AyCode.Core.Extensions +{ + public static class CollectionExtensions + { + public static DataChangeMode UpdateCollection(this IList source, TDataItem dataItem, bool isRemove) where TDataItem : IId + { + if (dataItem.Id.IsNullOrEmpty()) throw new ArgumentNullException(nameof(dataItem), "UpdateCollection->dataItem.Id.IsNullOrEmpty()"); + + var transferIndex = source.FindIndex(x => x.Id == dataItem.Id); + + if (isRemove) + { + if (transferIndex > -1) source.RemoveAt(transferIndex); + + return DataChangeMode.Remove; + } + + if (transferIndex > -1) + { + source[transferIndex] = dataItem; + return DataChangeMode.Update; + } + + source.Add(dataItem); + return DataChangeMode.Add; + } + + public static int FindIndex(this IList list, Predicate predicate) + { + for (var index = 0; index < list.Count; ++index) + { + if (predicate(list[index])) + return index; + } + + return -1; + } + + public static bool IsValidIndex(this IList? array, int index) + { + return array != null && index >= 0 && index < array.Count; + } + + public static bool TryGetValue(this IList array, int index, out T? value) + { + if (array.IsValidIndex(index)) + { + value = array[index]; + return true; + } + + value = default(T); + return false; + } + + public static int BinarySearch(this IList list, TKey key, Func getKey) where TKey : IComparable + { + var index1 = 0; + var index2 = list.Count - 1; + + while (index2 >= index1) + { + var obj1 = list[index1]; + if (getKey(obj1).CompareTo((object)key) == 0) return index1; + + var obj2 = list[index2]; + if (getKey(obj2).CompareTo((object)key) == 0) return index2; + + var index3 = (index1 + index2) / 2; + var obj3 = list[index3]; + var num = getKey(obj3).CompareTo((object)key); + + if (num == 0) return index3; + + if (num < 0) + { + index1 = index3 + 1; + --index2; + } + else + { + index2 = index3 - 1; + ++index1; + } + } + + return -1; + } + } +} diff --git a/AyCode.Core/Interfaces/IId.cs b/AyCode.Core/Interfaces/IId.cs new file mode 100644 index 0000000..d551577 --- /dev/null +++ b/AyCode.Core/Interfaces/IId.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AyCode.Core.Interfaces +{ + public interface IId + { + T Id { get; set; } + } +} diff --git a/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs b/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs index 0f59376..51465c2 100644 --- a/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs +++ b/AyCode.Interfaces/Addresses/IAcAddressForeignKey.cs @@ -1,6 +1,8 @@ -namespace AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Entities; -public interface IAcAddressForeignKey +namespace AyCode.Interfaces.Addresses; + +public interface IAcAddressForeignKey : IEntityGuid { public Guid AddressId { get; set; } } \ No newline at end of file diff --git a/AyCode.Interfaces/Entities/IEntity.cs b/AyCode.Interfaces/Entities/IEntity.cs index bc8b3e5..8f477d9 100644 --- a/AyCode.Interfaces/Entities/IEntity.cs +++ b/AyCode.Interfaces/Entities/IEntity.cs @@ -9,9 +9,9 @@ namespace AyCode.Interfaces.Entities { } - public interface IEntity : IEntity + public interface IEntity : IEntity, IId { - [Key] TPKey Id { get; set; } + //[Key] TPKey Id { get; set; } //T SetId(T id); } } diff --git a/AyCode.Interfaces/Users/IAcUsersRelation.cs b/AyCode.Interfaces/Users/IAcUsersRelation.cs index 74d753a..ad45c85 100644 --- a/AyCode.Interfaces/Users/IAcUsersRelation.cs +++ b/AyCode.Interfaces/Users/IAcUsersRelation.cs @@ -1,8 +1,6 @@ namespace AyCode.Interfaces.Users; -public interface IAcUsersRelation - where TUser : IAcUserBase - where TUserToServiceProvider : IAcUserToCompanyBase +public interface IAcUsersRelation where TUser : IAcUserBase where TUserToServiceProvider : IAcUserToCompanyBase { public List Users { get; set; } public List UserToServiceProviders { get; set; }