using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SKMC.Api.Common.Types { /// /// Expanded ObservableCollection to include some List Methods /// [Serializable] public class ObservableCollectionEx : ObservableCollection { /// /// Constructors /// public ObservableCollectionEx() : base() { } public ObservableCollectionEx(List l) : base(l) { } public ObservableCollectionEx(IEnumerable l) : base(l) { } /// /// Sorts the items of the collection in multiply keys. /// /// public void Sort(params (Func keySelector, bool ascending)[] sortExpressions) { if (sortExpressions == null || sortExpressions.Length == 0) return; // Get the sorted items as a list var sortedItems = this.ToList(); IOrderedEnumerable orderedEnumerable = null; for (int i = 0; i < sortExpressions.Length; i++) { var sortExpression = sortExpressions[i]; if (i == 0) { orderedEnumerable = sortExpression.ascending ? sortedItems.OrderBy(sortExpression.keySelector) : sortedItems.OrderByDescending(sortExpression.keySelector); } else { orderedEnumerable = sortExpression.ascending ? orderedEnumerable.ThenBy(sortExpression.keySelector) : orderedEnumerable.ThenByDescending(sortExpression.keySelector); } } sortedItems = orderedEnumerable.ToList(); // Reorder the collection using Move for (int i = 0; i < sortedItems.Count; i++) { var item = sortedItems[i]; var currentIndex = IndexOf(item); if (currentIndex != i) { Move(currentIndex, i); } } } } }