【问题标题】:How can I get a random element from a list? [duplicate]如何从列表中获取随机元素? [复制]
【发布时间】:2013-01-13 12:50:35
【问题描述】:

可能重复:
Access random item in list

我想从字符串列表中随机生成一个元素,但是我不知道如何实现这一点。我有 4 个元素:aaa、bbb、ccc、ddd。我想生成其中一个随机绘制在屏幕上,我搜索了一段 C# 代码,但它不起作用。有人知道怎么做吗?

【问题讨论】:

    标签: c# random


    【解决方案1】:

    当然,很简单:

    List<string> list = new List<string>() { "aaa", "bbb", "ccc", "ddd" };
    
    int l = list.Count;
    
    Random r = new Random();
    
    int num = r.Next(l);
    
    var randomStringFromList = list[num];
    

    另外,下一次您应该包含不起作用的代码以及(可能的)原因。

    【讨论】:

    • 我只是想知道你为什么选择 list.Count() 而不是 list.Count。有什么我不知道的区别吗?
    • 我确信扩展版本比属性版本快,但我刚刚进行了测试,结果发现属性比扩展版本快五倍。所以你应该使用不带括号的那个。
    • 我认为原因是因为您预先完成了所有工作来创建列表。它会为您记录该计数,因此您不妨使用它。 Count() 对于像普通旧数组这样的较低级别的东西更有用。这就是我对它的理解。确定这一点很有用,而不仅仅是假设。
    • Count() 在您不确切知道要处理的集合类型时很有用。 IListsArrays 都知道它们拥有多少物品,因此分别调用 CountLength 属性非常便宜。例如,当你有一个 IEnumerable 时,你不知道它是什么类型的集合,所以你必须使用 Count() 扩展方法,它遍历集合以计算项目(非常慢)。
    • @MattDavey:感谢您对阵列的更正。不知何故,长度属性让我忘记了。 IEnumerables 是一个更好的例子。
    【解决方案2】:

    我不确定这是否是您需要的,但为什么不创建一个随机整数,然后使用 string[int] 访问您的字符串数组。

    namespace ConsoleApplication1
    {
      using System;
      using System.Text;
    
      class Program
      {
        static void Main(string[] args)
        {
          Random random = new Random();
          string[] myStrings = new string[] { "aaa", "bbb", "ccc", "ddd" };
    
          for (int n = 0; n < 10; n++)
          {
            int rnd = random.Next(0, myStrings.Length);
            string s = myStrings[rnd];
            Console.WriteLine("-> {0}", s);
          }
    
          Console.ReadLine();
        }
      }
    }
    

    【讨论】:

    • 您的代码假定应用程序是控制台,但它是 XNA。
    • @user1306322 这不会使答案出错。问的问题与 XNA 完全无关。
    【解决方案3】:

    查看此链接以在 XNA 中绘制文本:

    http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Writing_text.php

    获得该部分后,您只需创建一个列表并选择一个随机元素传递给spriteBatch.DrawString()。这是一个可能看起来像的快速未经测试的版本。您应该修复此问题以适合您的代码。

    Random r = new Random();
    string rand = list[r.Next(list.Count)];
    
    spriteBatch.DrawString(spriteFont, rand, new Vector2(20, 45), Colors.Black);
    

    【讨论】:

    • 现在可以使用了!非常感谢!
    • @facebook-100000499165748:很高兴它有效。我不太确定编辑,但如果问题可以关闭,请务必接受答案。
    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2014-09-22
    • 2018-02-12
    相关资源
    最近更新 更多