using System.Collections.Generic;
public static void Main()
var scoringElements = new HashSet<ScoringElement>
new ScoringElement() { Id = 1, Name = "A", Index = 0 },
new ScoringElement() { Id = 2, Name = "B", Index = 1 },
new ScoringElement() { Id = 3, Name = "C", Index = 2 },
new ScoringElement() { Id = 4, Name = "D", Index = 3 }
foreach(var scoringElement in scoringElements)
Console.WriteLine(scoringElement.Name);
Console.WriteLine(scoringElement.Index);
Console.WriteLine("----------------");
var scoringElementB = scoringElements.First(s => s.Name == "B");
scoringElements.Move(scoringElementB, 0);
foreach(var scoringElement in scoringElements)
Console.WriteLine(scoringElement.Name);
Console.WriteLine(scoringElement.Index);
public class ScoringElement
public int Id { get; set; }
public string Name { get; set; }
public int Index { get; set; }
public static class ScoringElementsExtensions
public static void Move(this ISet<ScoringElement> scoringElements, ScoringElement scoringElement, int newIndex)
var ordered = scoringElements.OrderBy(x => x.Index).ToList();
var currentIndex = scoringElement.Index;
ordered.RemoveAt(scoringElement.Index);
scoringElement.Index = newIndex;
ordered.Insert(newIndex, scoringElement);
if (currentIndex < newIndex)
for (int i = currentIndex; i< newIndex; i++)
for (int i = newIndex + 1; i <= currentIndex; i++)