private void TestMove(OrderMovement orderMovement) { //Setup var isContiguous = new List <IIsOrdered>(); for (int i = 0; i < 5; i++) { isContiguous.Add(new TestSubject { Id = i, Order = i }); } var subject = isContiguous[2]; //Exercise IsOrderedHelper.MoveWithinList(isContiguous, subject, orderMovement); //Test and assert Assert.IsTrue(IsOrderedHelper.IsContiguous(isContiguous)); if (orderMovement == OrderMovement.Up) { Assert.IsTrue(subject.Order == 1); } else { Assert.IsTrue(subject.Order == 3); } }
public static void MoveWithinList <T>(IEnumerable <T> list, T mover, OrderMovement orderMovement) where T : class, IIsOrdered { //Firm up enumeration problems list = list.ToList(); //Ensure contiguousnes MakeContiguous(list); if (mover.Order == 0 && orderMovement == OrderMovement.Down) { return;//Nothing to do because this is already the first in the list } if (mover.Order == list.Count() && orderMovement == OrderMovement.Up) { return;//Nothing to do because this is already the last in the list } int delta; switch (orderMovement) { case OrderMovement.Up: delta = -1; break; case OrderMovement.Down: delta = 1; break; default: throw new System.NotImplementedException(); } foreach (var iIsOrdered in list.OrderBy(i => i.Order)) { if (iIsOrdered.Order == mover.Order + delta) { iIsOrdered.Order += -1 * delta; mover.Order += delta; break; //There is no need to continue } } }