using System.Collections.ObjectModel;
using System.Collections.Generic;
public static void Main()
var arch = new Archivable()
var dl = new OrderableDisplayList<Archivable>();
public class Archivable : IOrderable, IArchivable
public bool IsArchived { get; set; }
public int Ordinal { get; set; }
public interface IArchivable
bool IsArchived { get; set; }
public interface IOrderable
int Ordinal { get; set; }
public class OrderableDisplayList<TItem> where TItem : IOrderable
private OrderableCollection<TItem> orderableItems { get; set; }
public void RestoreItem<T>(T item) where T : TItem, IArchivable
if(orderableItems is not ArchivableOrderableCollection<T> items)
throw new InvalidOperationException();
public void RestoreFirstItem()
RestoreItem(orderableItems.First());
public class OrderableCollection<T> : Collection<T> where T : IOrderable
public virtual IEnumerable<T> OrderedItems => Items.OrderBy(o => o.Ordinal);
public virtual void MoveUp(T item)
int OrdinalOfCurrentRow = item.Ordinal;
if (OrdinalOfCurrentRow > 1)
int OrdinalOfSwapRow = item.Ordinal--;
OrderedItems.Where(o => o.Ordinal == OrdinalOfSwapRow).FirstOrDefault().Ordinal = OrdinalOfCurrentRow;
item.Ordinal = OrdinalOfSwapRow;
public class ArchivableOrderableCollection<T> : OrderableCollection<T> where T : IOrderable, IArchivable
public override IEnumerable<T> OrderedItems => Items.Where(_ => !_.IsArchived).OrderBy(_ => _.Ordinal);
public void Archive(T Item)
public void Restore(T Item)
throw new InvalidOperationException();
OrderedItems.Where(o => o.Ordinal >= 1).ToList().ForEach(f => { f.Ordinal++; });