'How do I return a list with newly added objects from a method (Beginner) C#

I am having trouble returning a list from a method called "omvandlaBetyg" which translates to "convert grades". I have added a total of 5 'char' to my list. I wish to return the list from the method.

With many attempts I have not been able to solve this issue. I am sorry for having set the names of the lists/variables to another language.

If it is too difficult to try and find a solution for my issue then I will translate it as soon as possible.

Thanks in advance.

    static void Main(string[] args)
    {
        string[] ämnen = { "Matematik", "Svenska", "Engelska", "Historia", "Fysik" };
        int[] poäng = new int[5];
        List<char> betyg = new List<char>(); // This is the list that is currently empty

        Program.LäsPoäng(poäng);

        Program.omvandlaBetyg(poäng, betyg);

        Program.skrivUtBetyg(betyg, ämnen);

    }
    static int LäsPoäng(int[] poäng)
    {
        Console.Write("Ange totalpoäng för matematik:");
        int matPoäng = Convert.ToInt32(Console.ReadLine());

        Console.Write("Ange totalpoäng för svenska:");
        int svePoäng = Convert.ToInt32(Console.ReadLine());

        Console.Write("Ange totalpoäng för engelska:");
        int engPoäng = Convert.ToInt32(Console.ReadLine());

        Console.Write("Ange totalpoäng för historia:");
        int hisPoäng = Convert.ToInt32(Console.ReadLine());

        Console.Write("Ange totalpoäng för fysik:");
        int fysPoäng = Convert.ToInt32(Console.ReadLine());

        poäng[0] = matPoäng;
        poäng[1] = svePoäng;
        poäng[2] = engPoäng;
        poäng[3] = hisPoäng;
        poäng[4] = fysPoäng;

        return poäng[4];
    }
    static char omvandlaBetyg(int[] poäng, List <char> betyg)
    {

        foreach (int i in poäng)
        {
            if (i < 50)
            {
                betyg.Add('F');
            }
            else if (i >= 50 && i < 60)
            {
                betyg.Add('E');
            }
            else if (i > 60 && i < 75)
            {
                betyg.Add('D');
            }
            else if (i > 75 && i < 90)
            {
                betyg.Add('C');
            }
            else if (i > 90 && i < 100)
            {
                betyg.Add('B');
            }
            else if (i == 100)
            {
                betyg.Add('A');
            }
        }
        return betyg; // This is the list that has been updated with newly added char's
                      // that i wish to return from this method
    }
    static void skrivUtBetyg(List<char> betyg, string[] ämnen)
    {
        foreach (char item in betyg)
        {
             Console.WriteLine("Betyg i : " + item );
        }
    }
    static void Statistik()
    {

    }

}

}



Solution 1:[1]

You can just change the return type of the method omvandlaBetyg from char to List<char>

Here I fixed your code:

static List<char> omvandlaBetyg(int[] poäng, List <char> betyg)
{
    foreach (int i in poäng)
    {
        if (i < 50)
        {
            betyg.Add('F');
        }
        else if (i >= 50 && i < 60)
        {
            betyg.Add('E');
        }
        else if (i > 60 && i < 75)
        {
            betyg.Add('D');
        }
        else if (i > 75 && i < 90)
        {
            betyg.Add('C');
        }
        else if (i > 90 && i < 100)
        {
            betyg.Add('B');
        }
        else if (i == 100)
        {
            betyg.Add('A');
        }
    }
    return betyg;
}

Solution 2:[2]

I'm assuming you're trying to learn C#, but there are a few odd things in your code; here's what it could look like:

static void Main(string[] args)
{
    var ämnen = new string[] { "Matematik", "Svenska", "Engelska", "Historia", "Fysik" };

    // No need to create your lists/arrays here and pass them to these methods
    // as they can return them directly

    var poäng = LäsPoäng(ämnen);
    var betyg = OmvandlaBetyg(poäng);
    SkrivUtBetyg(betyg);
}

// The purpose of that method is to query grades and return them
static List<int> LäsPoäng(string[] ämnen)
{
    // Create your list here, and return it when you've asked all grades
    var poäng = new List<int>();

    // Redundant code, you've got a list of subjects so you might as well use them
    // This means you could add new subjects without changing this method
    foreach (var str in ämnen)
    {
        Console.Write($"Ange totalpoäng för {str.ToLower()}:");
        poäng.Add(Convert.ToInt32(Console.ReadLine()));
    }

    return poäng;
}

// The purpose of that method is to convert integer grades to A-F
// Method name should use camel case
static List<char> OmvandlaBetyg(List<int> poäng)
{
    // Create your list here, and return it when you've converted all grades
    var betyg = new List<char>();

    foreach (int i in poäng)
    {
        if (i < 50)
            betyg.Add('F');
        else if (i < 60) // No need to check lower bound, previous "if" takes care of it
            betyg.Add('E');
        else if (i < 75)
            betyg.Add('D');
        else if (i < 90)
            betyg.Add('C');
        else if (i < 100)
            betyg.Add('B');
        else
            betyg.Add('A');
    }

    return betyg;
}

// Camel case
static void SkrivUtBetyg(List<char> betyg)
{
    foreach (char item in betyg)
    {
        Console.WriteLine($"Betyg i : {item}");
    }
}

It could still be improved and is by no means perfect, but hopefully it will give you some pointers.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sukhrob Ilyosbekov
Solution 2 Arthur Rey