如何从列表中选择一个随机字符串并将其分配给变量C#

本文关键字:串并 字符串 字符 分配 变量 随机 一个 列表 选择 | 更新日期: 2023-09-27 18:21:23

我正在尝试制作一个程序,用户在其中输入一个字符串,然后将该字符串存储在名为word1的列表中。我想从列表中选择一个随机字符串,并将其显示在标签中。我正在尝试使用多种方法和类作为练习来实现这一点。这是我的代码:

这是Class1.cs:类

    main main = new main();
    public string flashCards1()
    {
        List<string> word1 = main.GetList1();
        Random rnd = new Random();
        int rtn = rnd.Next(word1.Count - 1);
        string word = word1[rtn];
        string rtnWord = word.ToString();
        return rtnWord;
    }

这个在main.cs(而不是main)中,它与Class1对话。就像我说的,这部分可能没有必要,但我试图用多种方法练习。

    private List<string> word2 = new List<string>();
    private List<string> word1 = new List<string>();
    public List<string> GetList1()
    {
        return word1;
    }
    public void SetList1(List<string> updatedList)
    {
        word1 = updatedList;
    }

这个在Form1.cs中,并将标签设置为flashCards1的返回值:

    private void go_Click(object sender, EventArgs e)
    {
        menu.Visible = false;
        cards.Visible = true;
        label1.Text = class1.flashCards1();
    }

这也在Form1.cs中,并将文本保存到List:

    private void enter_Click(object sender, EventArgs e)
    {
        List<string> word1 = main.GetList1();
        word1.Add(textBox1.Text);
        main.SetList1(word1);
    }

当我运行此代码时,它会给我错误:

System.ArgumentOutOfRangeException未处理HResult=-2146223086消息='maxValue'必须大于零。参数名称:maxValueParamName=最大值来源=mscorlibStackTrace:在System.Random.Next(Int32 maxValue)位于C:''Users''lottes''Source''Workspaces''Workspace''WindowsFormsApplication1''WindowsFormsApplication1''Class1.flash Cards1()位于C:''Users''lottes''Source''Workspaces''Workspace''WindowsFormsApplication1''WindowsFormsApplication1''Form1.cs:line 62位于System.Windows.Forms.Control.OnClick(EventArgs e)位于System.Windows.Forms.Button.OnClick(EventArgs e)在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)在System.Windows.Forms.Control.WmMouseUp(消息&m,鼠标按钮按钮,Int32次点击)位于System.Windows.Forms.Control.WndProc(消息&m)位于System.Windows.Forms.ButtonBase.WndProc(消息&m)位于System.Windows.Forms.Button.WndProc(消息&m)位于System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)位于System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息&m)在System.Windows.Forms.NativeWindow.DebugableCallback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)位于System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&MSG)位于System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID,Int32 reason,Int32 pvLoopData)位于System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32原因,ApplicationContext上下文)位于System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32原因,ApplicationContext上下文)位于System.Windows.Forms.Application.Run(Form mainForm)位于C:''Users''lottes''Source''Workspaces''Workspace''WindowsFormsApplication1''WindowsFormsApplication1''Program.Main(位于System.AppDomain_nExecuteAssembly(RuntimeAssembly程序集,String[]参数)位于System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String[]args)位于Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()位于System.Threading.ThreadHelper.ThreadStart_Context(对象状态)位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,Object state,Boolean preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)位于System.Threading.ThreadHelper.ThreadStart()内部异常:

我试着输入了很多值,但似乎不起作用。我还看了这条线索:如何从列表中获得随机字符串并将其分配给变量

然而,他们的解决方案给了我同样的错误。如有任何帮助,我们将不胜感激。如果这是太多/太少的信息,很抱歉。我试着去理解。

如何从列表中选择一个随机字符串并将其分配给变量C#

问题出在Random.Next(int)方法上。当您尝试使用负值作为最大参数时,会出现此异常。这是因为它返回一个介于>= 0 and < maxValue之间的值。它被负值搞砸了(在列表中有0个项目时为-1)

修复很容易,只需更改:

        int rtn = rnd.Next(word1.Count - 1);

进入:

        int rtn = rnd.Next(word1.Count);

这应该是有效的,因为random总是返回一个小于最大值的值,所以应该访问0到N-1,其中N是列表的大小。

在那之后,你会遇到更多的问题(与这个直接问题的关系较小),因为核心问题是在flashcards1()函数中使用列表之前,你没有初始化列表并添加值。在您向我们展示的示例中,尚不清楚如何解决此问题,但我建议您查看函数的执行顺序。