using System.Collections.Generic;
private readonly OrderModeRetriever _orderModeRetriever;
public Program(OrderModeRetriever orderModeRetriever)
_orderModeRetriever = orderModeRetriever;
private List<Grouping> _groupings = new List<Grouping>();
private Dictionary<Grouping, List<Item>> _initialOrderStateMap;
private OrderByScoreMode _orderByMode = OrderByScoreMode.Unordered;
public void OnOrderByScore()
MemorizeInitialOrderState();
ApplyOrderByModeToItems();
void MemorizeInitialOrderState()
if (_initialOrderStateMap == null)
_initialOrderStateMap = new Dictionary<Grouping, List<Item>>();
foreach (var grouping in _groupings)
_initialOrderStateMap.Add(grouping, grouping.Items);
_orderModeRetriever.GetNext(_orderByMode);
void ApplyOrderByModeToItems()
foreach (var grouping in _groupings)
OrderItemsInGroupingByMode(grouping, _orderByMode);
void OrderItemsInGroupingByMode(Grouping grouping, OrderByScoreMode orderByMode)
case OrderByScoreMode.Ascending:
grouping.Items = grouping.Items.OrderBy(x => x.Score).ToList();
case OrderByScoreMode.Descending:
grouping.Items = grouping.Items.OrderByDescending(x => x.Score).ToList();
case OrderByScoreMode.Unordered:
grouping.Items = _initialOrderStateMap[grouping];
public class OrderModeRetriever
public OrderByScoreMode GetNext(OrderByScoreMode orderByMode)
case OrderByScoreMode.Ascending: return OrderByScoreMode.Descending;
case OrderByScoreMode.Descending: return OrderByScoreMode.Unordered;
case OrderByScoreMode.Unordered: return OrderByScoreMode.Ascending;
default: return OrderByScoreMode.Unordered;
public enum OrderByScoreMode
public List<Item> Items { get; set; }
public double Score { get; set; }