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);
}
}
}
}
}