C# 如何解决StringBuilder问题?

C# 如何解决StringBuilder问题?,c#,string,stringbuilder,C#,String,Stringbuilder,我在做什么:使用StringBuilder替换字符串中的变量,以生成包含变量的问题 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

我在做什么:使用
StringBuilder
替换字符串中的变量,以生成包含变量的问题

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();
}
问题:如果字符串
q
(正在修改的字符串)=“问题1”,
StringBuilder.Replace
将不仅仅停留在
sb。Replace(“问题1”…)
仍将计算问题2和3。因此,随着问题数量的增加,这个问题的效率也随之提高


问题:如何创建包含变量的问题,以便在同一问题结构中有效地提供变量?

我建议使用
字典

Random rnd=new Random();
int questionNumber=rnd.Next(1,4)//生成一个随机问题编号
INTA=下一个(1,10)的rnd//创建随机数,使问题每次都不同
int b=下一个(1,15)的rnd;
int c=下一个(1,15)的rnd;
新字典
{
{1,“什么是“+a+”+“+a+”?”},
{2,“什么是“+a+”+“+b+”?”},
{3,“什么是“+(a*b)+”+“+c+”?”},
};
var-question=string.Empty;
if(问题.TryGetValue(问题编号,问题外))
{
//密钥存在,您可以在此处阅读您的问题
}
更新:

如果希望在一个函数中创建字典,在另一个函数中创建随机数,则必须有一个目标函数:

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);
    }  
}
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();
}
static Random rnd=new Random();
静态void Main(字符串[]参数)
{   
数量=15;
var questions=newdictionary();
for(int i=0;i
和其他职能:

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);
    }  
}
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();
}
公共静态列表CreateVariables(int-variableQuantity)
{
var变量=新列表();
对于(int i=0;i
考虑使用switch语句

        Random rnd = new Random();
        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 question;

        switch (rnd.Next(1, 4)) {
            case 1: {
                question = "What is " + a + " + " + a + " ?";

                break;
            }
            case 2: {
                question = "What is " + a + " + " + b + " ?";

                break;
            }
            case 3: {
                question = "What is " + (a * b) + " + " + c + " ?";

                break;
            }
            default: {
                question = "Default Value";

                break;
            }
        }
C#8:


为了增加可读性,我建议您使用以下表单:
$“什么是{a}+{b}?”
。它帮助很大,特别是在字符串连接+与数学+混合的情况下。您的代码没有多大意义。你把“Question”+q放入一个字符串中,然后立即用与问题编号无关的其他内容替换它。嗨,更新了这样做-我希望它有帮助,然后我将字符串
“What is{a}+{b}?”
放入数组或字典中,并按问题编号查找它们。将它们设置为字符串格式,以便您仍然可以填充孔。请参见“是”,它们可以具有单独的功能。我必须查看您的代码才能知道错误所在。使用数组,通过index@irdis:数组的大小是固定的。@Irdis字典用于OP希望键为
字符串
值的情况,例如,
问题1
,正如他在问题中所说。这是一件艺术品,谢谢!真是不可思议answer@kizzer非常感谢你!对我来说,这意味着整个世界!祝你今天愉快!:)嗨,彼得,我能把int放在一个函数中吗?这个函数在每一个例子的开头都会被调用?那么,每次生成问题时,都会选择新的变量?你认为这是有效的吗?感谢you@kizzer您的意思是将int传递给函数(其中包含switch语句),然后返回结果吗?