//using System; //using System.Linq.Expressions; //using System.Reflection; //namespace Modules.Library.Domain.Utils; //internal static class OrderBaseUtil //{ // internal static void SetItemOrder(IEnumerable items, ushort lastOrder, ushort newOrder, Expression> getOrderPropertyExpr, Func getOrderPropertyFunc) // { // if (IsOrderOutOfRange(items, getOrderPropertyFunc, lastOrder)) throw new ArgumentOutOfRangeException(nameof(lastOrder)); // if (IsOrderOutOfRange(items, getOrderPropertyFunc, newOrder)) throw new ArgumentOutOfRangeException(nameof(newOrder)); // var minOrder = Math.Min(lastOrder, newOrder); // var maxOrder = Math.Max(lastOrder, newOrder); // var orderedItems = OrderedItemsInsideRange(items, getOrderPropertyFunc, minOrder, maxOrder).ToList(); // var targetItem = orderedItems.First(q => getOrderPropertyFunc(q) == newOrder); // bool seen = false; // for (int i = 0; i < orderedItems.Count; i++) // { // if (object.ReferenceEquals(orderedItems[i], targetItem)) // { // orderedItems[i].SetPropertyValue(getOrderPropertyExpr, newOrder); //orderedItems[i].Order = newOrder; // seen = true; // } // //else if (seen && items[i].Order <= newOrder) // else if (seen && getOrderPropertyFunc(orderedItems[i]) <= newOrder) // { // orderedItems[i].SetPropertyValue(getOrderPropertyExpr, (ushort)(newOrder - 1)); //orderedItems[i].Order--; // move it left // } // //else if (items[i].Order >= newOrder) // else if (getOrderPropertyFunc(orderedItems[i]) >= newOrder) // { // orderedItems[i].SetPropertyValue(getOrderPropertyExpr, (ushort)(newOrder + 1)); //orderedItems[i].Order++; // move it right // } // } // } // private static IEnumerable OrderedItemsInsideRange(IEnumerable items, Func getOrderPropertyFunc, ushort min, ushort max) => // items.Where(q => getOrderPropertyFunc(q) >= min && getOrderPropertyFunc(q) <= max); // internal static bool IsOrderOutOfRange(IEnumerable items, Func getOrderPropertyFunc, ushort order) => order < 0 || // order > items.Select(getOrderPropertyFunc).DefaultIfEmpty((ushort)0).Max(); //} //public static class LambdaExtensions //{ // public static void SetPropertyValue(this T target, Expression> memberLamda, TValue value) // { // var memberSelectorExpression = memberLamda.Body as MemberExpression; // if (memberSelectorExpression != null) // { // var property = memberSelectorExpression.Member as PropertyInfo; // if (property != null) // { // property.SetValue(target, value, null); // } // } // } //}