Search code examples
c#arrayslistfor-looprow

Losing value if backwards List printing matrix


I need to display a Sheet so that the lines are aligned bottom and left. If there are no 10 characters in the word, the number of "+" characters is added so that the total of the line is 10 characters (see my output).

Why, when I print a List, I lose one row?

What's wrong with my piece of code? This matrix should be 10X10.

My output

        List<string> filtredList = new List<string>() { "Jacuzzi", "Action", "Chinchilla", "Squeezebox", "Academic", "Abstract" };
        int row = 10;
        filtredList = Sorting(filtredList); //method is sorting by descending.
        foreach (var item in filtredList) Console.WriteLine("Item: " + item + " length: " + item.Length);
        Console.WriteLine("-------------------------------------");
        //AFTER SORTING IN LIST:
        //1)Squeezebox 2)Chinchilla 3)Academic 4)Abstract 5)Jacuzzi 6)Action

        for (int i = 10; i > 0; i--)
        {
            try
            {
                if (filtredList[i].Length != 10)
                {
                    Console.Write(filtredList[i]);
                    row = 10 - filtredList[i].Length;
                    Console.WriteLine(string.Concat(Enumerable.Repeat("+", row)));
                }
                else Console.WriteLine(filtredList[i]);
            }
            catch (SystemException)
            {
                row = 10;
                Console.WriteLine(string.Concat(Enumerable.Repeat("+", row)));
            }   
        } 

Solution

  • Because your for loop is never gets to 0:

    for (int i = 10; i > 0; i--)
    

    i goes from 10 to 1 and that's why the first item of your list never prints.

    Note:

    Index of first item of an array or a list is 0

    The better code would be:

    for (int i = 9; i >= 0; i--)
    

    Although you can use better alternatives for some of your code, but this will solve your problem.

    EDIT:

    You can use this approach (just change the for part to this) to not raise any exceptions (because its not normally a use case for try-catch)and also get faster results:

    for (int i = 9; i >= 0; i--)
    {
        if (i < filtredList.Count)
        {
            if (filtredList[i].Length != 10)
            {
                Console.Write(filtredList[i]);
                row = 10 - filtredList[i].Length;
                Console.WriteLine(new string('+', row));
            }
            else Console.WriteLine(filtredList[i]);
        }
        else
        {
            row = 10;
            Console.WriteLine(new string('+', row));
        }
    }