namespace StubAPI; public static class Extensions { internal static Task AddItem(this IList collection, T? item) { if(item == null || collection.Contains(item)) { return Task.FromResult(default(T)); } collection.Add(item); return Task.FromResult(item); } internal static Task DeleteItem(this IList collection, T? item) { if(item == null) { return Task.FromResult(false); } bool result = collection.Remove(item!); return Task.FromResult(result); } internal static Task UpdateItem(this IList collection, T? oldItem, T? newItem) { if(oldItem == null || newItem == null) return Task.FromResult(default(T)); if(!collection.Contains(oldItem)) { return Task.FromResult(default(T)); } collection.Remove(oldItem!); collection.Add(newItem!); return Task.FromResult(newItem); } public static IEnumerable GetItemsWithFilterAndOrdering(this IEnumerable list, Func filter, int index, int count, Enum? orderCriterium, bool descending = false ) where T : class { IEnumerable query = list; query = query.Where(filter); if(orderCriterium != null) { query = query.OrderByCriteria(orderCriterium, descending); } return query .Skip(index * count) .Take(count); } public static IOrderedEnumerable OrderByCriteria(this IEnumerable list, Enum orderCriterium, bool descending = false ) where T : class { var orderCriteriumString = orderCriterium.ToString(); if (orderCriteriumString.StartsWith("By")) { orderCriteriumString = orderCriteriumString.Substring(2); } var propertyInfo = typeof(T).GetProperty(orderCriteriumString); if (propertyInfo == null) { throw new ArgumentException($"No property {orderCriterium} in type {typeof(T)}"); } return descending ? list.OrderByDescending(x => propertyInfo.GetValue(x)) : list.OrderBy(x => propertyInfo.GetValue(x)); } }