Search code examples
c#stringstringbuilder

How can I solve my StringBuilder problem?


What I am doing: Replacing variables within a string using StringBuilder to generate questions that contain variation.

string question;

void CreateNewQuestion()
{
    Random rnd = new Random();
    int questionNumber = rnd.Next(1, 4); //Generate a random question number
    int a = rnd.Next(1, 10); //Create random numbers so the question is different each time
    int b = rnd.Next(1, 15);
    int c = rnd.Next(1, 15);

    string q = questionNumber.ToString(); 

    StringBuilder sbq = new StringBuilder("Question" +q);//StringBuilder is now called to replace the randomly called for question with its new variables
    sbq.Replace("Question1", $"What is {a} + {a} ?");
    sbq.Replace("Question2", $"What is {a} + {b} ?");
    sbq.Replace("Question3", $"What is {a*c} + {a} ?"");

    question = sbq.ToString();
}

The problem: If string q (the one being modified) = "Question1", StringBuilder.Replace won't just stop at sb.Replace("Question1"...) it will still calculate for Question 2 and 3. Thus as the number of questions increases, so does the inefficiency of this.

The question: How can I create questions that contain variables so as to provide variation within the same question structure in an efficient manner?


Solution

  • I would suggest to use Dictionary<TKey, TValue>:

     Random rnd = new Random();
     int questionNumber = rnd.Next(1, 4); //Generate a random question number
     int a = rnd.Next(1, 10); //Create random numbers so the question is different each time
     int b = rnd.Next(1, 15);
     int c = rnd.Next(1, 15);            
    
     var questions = new Dictionary<int, string>
     {
         { 1, "What is " + a + " + " + a + " ?" },
         { 2, "What is " + a + " + " + b + " ?" },
         { 3, "What is " + (a * b) + " + " + c + " ?" },
     };
    
     var question = string.Empty;
     if (questions.TryGetValue(questionNumber, out question))
     {
         // key exists and you can read your question here
     }
    

    UPDATE:

    If you want to have a dictionary to be created in one function and the random numbers in another, then you it is necessary to have one goal functions:

    static Random rnd = new Random();
    static void Main(string[] args)
    {   
        int questionQuantity = 15;
        var questions = new Dictionary<int, string>();
    
        for (int i = 0; i < questionQuantity; i++)
        {
            int variableCount = rnd.Next(17);
            var variables = CreateVariables(variableCount);
            var signs = CreateSigns(variableCount - 1);
            var question = CreateQuestion(variables, signs);
            questions.Add(i, question);
        }  
    }
    

    And other functions:

    public static List<int> CreateVariables(int variableQuantity)
    {
        var variables = new List<int>();
        for (int i = 0; i < variableQuantity; i++)
        {
             variables.Add(rnd.Next(1, 15));
        }
        return variables;
    }
    
    public static List<char> CreateSigns(int variableQuantity)
    {
        var operators = new char[] {'+', '-', '/', '*' };
        var randomOperators = new List<char>();
        for (int i = 0; i < variableQuantity; i++)
        {
            randomOperators.Add(operators[ rnd.Next(0, 3) ]);
        }
        return randomOperators;
    }
    
    public static string CreateQuestion(List<int> variables, List<char> operations)
    {   
        StringBuilder sb = new StringBuilder();
        sb.Append("What is ");
        for (int i = 0, j = 0; i < variables.Count; i++)
        {
            sb.Append(variables[i]);                
            if (i % 2 != 0)
            {
                sb.Append(" ");
                sb.Append(operations[j]);
                sb.Append(" ");
                j++;
            }   
        }
        sb.Append("?");
        return sb.ToString();
    }