C# 随机排列问题/按钮上的答案

C# 随机排列问题/按钮上的答案,c#,winforms,linq-to-xml,C#,Winforms,Linq To Xml,我创建了一个问答游戏,并将我的问题存储在XML文件中(一个XML文件用于简单、中等和困难问题),并创建了一个数组: var quiz = XDocument.Load(path); _questions = quiz.Descendants("question") .Select(q => new Question() { ID = int.Parse(q.Attribute("

我创建了一个问答游戏,并将我的问题存储在XML文件中(一个XML文件用于简单、中等和困难问题),并创建了一个数组:

        var quiz = XDocument.Load(path);
        _questions = quiz.Descendants("question")
            .Select(q => new Question()
            {
                ID = int.Parse(q.Attribute("id").Value),
                Difficulty = int.Parse(q.Attribute("difficulty").Value),
                QuestionText = q.Element("text").Value,
                Answers = q.Element("answers")
                    .Descendants()
                    .Select(a => a.Value)
                    .ToArray(),
                CorrectAnswer = q.Element("answers")
                    .Descendants()
                    .Select((a, i) => new { node = a.Name, index = i })
                    .First(a => a.node == "correctAnswer").index
            });
    }
我想知道是否有随机化的方法

  • 显示的问题和
  • 哪些答案在哪些按钮上 我这样问是因为,在这一分钟,问题以完全相同的顺序显示(通过数组,并按照写入顺序逐字显示),并且正确答案每次都在同一个按钮上。我想知道是否有一种方法可以随机/洗牌这些不会完全破坏我的程序

    编辑:我现在已经对随机问题部分进行了排序,只需要找出如何将答案出现在按钮上的顺序随机化。XML文件的示例:

    <question id="2" difficulty="1">
    <text></text>
    <answers>
    
    </answers>
    
    
    


    感谢您的帮助和/或回复。

    从xml读取数据时使用随机数排序:

       var rand = new Random();
       var quiz = XDocument.Load(path);
        _questions = quiz.Descendants("question")
            .Select(q => new Question()
            {
                ID = (int)q.Attribute("id"),
                Difficulty = (int)q.Attribute("difficulty"),
                QuestionText = (string)q.Element("text"),
                Answers = q.Element("answers")
                    .Descendants()
                    .Select(a => (string)a)
                    .OrderBy(a => rand.Next()) // randomizing answers
                    .ToArray(),
                CorrectAnswer = (string)q.Element("answers")
                    .Descendants("correctAnswer")
                    .First() // use value instead of index
            })
            .OrderBy(q => rand.Next()); // randomizing questions
    
    程序的其余部分将保持原样


    我对你的项目进行了重构。结果你可以在这里得到。你有很多重复的代码。尝试在应用程序中对任何信息进行单一表示。这将使您的项目易于维护

    关于重构的要点:

    • 使用用户控件将相关控件分组在一起。我将与难度选择相关的控件提取到
      难度选择控件
      中,并将与显示问题和选择答案相关的控件提取到
      问题控件
    • 使用
      BringToFront
      SendToBack
      方法更改控件的Z顺序
    • 使用事件将用户控件中发生的事件通知用户控件的客户端。我创建了
      DifficultySelected
      事件,用于通知使用所选难度。和
      QuestionResponsed
      事件,用于通知当前问题的回答是否正确
    • 使用自定义事件参数将附加数据传递给事件处理程序
    • 使用枚举<代码>难度。中等比
      2
      可读性强得多
    • 如果您的代码中有类似的方法,那么尝试将公共逻辑提取到一个方法中。看看问题按钮点击的处理程序,我在代码中使用了四个不同的处理程序
    • 使用控件的描述性名称,而不是
      标签1
      按钮4

    还有改进的地方。例如,我在
    困难选择控制中看到重复-所有处理程序看起来都相似。还有按钮背景色的复制。您应该有一个为按钮的不同状态定义颜色的地方。此外,还有一种难看的过滤方法(我将enum转换为int)。我已经将答案随机移动到
    问题控制中

    非常感谢!有没有办法用按钮上的答案来做这件事?在XML文件中,正确的答案围绕着它们,错误的答案围绕着它们them@user2141272您唯一应该更改的是正确答案验证。通过值而不是索引来实现这一点我该怎么做?换零件?很抱歉提出这些问题,但我想最好让askI看看你的编辑。如果我键入.First(a=>a.Name==“correctAnswer”).Value,它所说的值不能隐式地将类型“string”转换为“int”。噢,我的天哪,非常感谢!你不明白我有多感激你!不过有一个小问题;它说简单部分有20个问题,中等部分有18个,硬部分有19个,而每个部分有20个问题?