Search code examples
c#sortedlist

Arranging a sorted list in staggered order


I have a sorted list which I want to stagger the output of for another part of my project but can't figure it out the output should look like:
enter image description here

Here is what I have so far (This was made with https://dotnetfiddle.net/) for testing

public static void Main()
{   
    List<ColumnArrangment> listVersion = new List<ColumnArrangment>();
    listVersion.Add(new ColumnArrangment { Name ="Questions", Priority = 2, Amount = 2});
    listVersion.Add(new ColumnArrangment { Name ="Parts", Priority = 1, Amount = 2});
    listVersion.Add(new ColumnArrangment { Name ="CodeLetters", Priority = 4, Amount = 2});
    listVersion.Add(new ColumnArrangment { Name ="Answers", Priority = 3, Amount = 2});
    // Order
    List<ColumnArrangment> SortedList = listVersion.OrderBy(o=>o.Priority).ToList();
    foreach(var obj in SortedList.ToList())
    {
        int sortedIndex = SortedList.FindIndex(i => i.Name.Equals(obj.Name));
        for(var a = SortedList.ElementAt(sortedIndex).Amount; a > 0; a--)
        {
            if(SortedList.ElementAt(sortedIndex).Amount > 0) {
                SortedList.ElementAt(sortedIndex).Amount -= 1;
                Console.WriteLine(obj.Name);
            }
        }
    }
}
public class ColumnArrangment
{
    public string Name { get; set; }
    public int Priority { get; set; }
    public int Amount { get; set; }

    public ColumnArrangment()
    { }

    public ColumnArrangment(ColumnArrangment ca)
    {
        Name = ca.Name;
        Priority = ca.Priority;
        Amount = ca.Amount;
    }
}

The help is appreciated thanks!


Solution

  • When the list is already ordered by priority you can simply print the item and reduce its Amount as long as there are any ColumnArrangement that have Amount.

     static void Main(string[] args)
     {
            List<ColumnArrangement> listVersion = new List<ColumnArrangement>();
            listVersion.Add(new ColumnArrangement { Name = "Questions", Priority = 2, Amount = 2 });
            listVersion.Add(new ColumnArrangement { Name = "Parts", Priority = 1, Amount = 2 });
            listVersion.Add(new ColumnArrangement { Name = "CodeLetters", Priority = 4, Amount = 2 });
            listVersion.Add(new ColumnArrangement { Name = "Answers", Priority = 3, Amount = 2 });
            listVersion.Add(new ColumnArrangement { Name = "Test", Priority = 5, Amount = 4 });
    
            listVersion = listVersion.OrderBy(x => x.Priority).ToList();
            while (listVersion.Any(x => x.Amount > 0))
            {
                foreach (var item in listVersion)
                {
                    if (item.Amount > 0)
                    {
                        Console.WriteLine(item.Name);
                        item.Amount--;
                    }
                }
            }
    }
    

    prints:

    Parts
    Questions
    Answers
    CodeLetters
    Test
    Parts
    Questions
    Answers
    CodeLetters
    Test
    Test
    Test