【问题标题】:Fastest way to get a random value from a string array in C#?从 C# 中的字符串数组中获取随机值的最快方法?
【发布时间】:2009-09-08 08:57:53
【问题描述】:

在 .net 2.0 框架上从 C# 中的字符串数组获取随机值的最快方法是什么?我想他们可能有这个:

string[] fileLines = File.ReadAllLines(filePath);
fileLines.GetRandomValue();

是的,我知道 GetRandomValue() 不是一个实际的方法,是否有类似的方法或多或少同样简短和甜蜜?

【问题讨论】:

标签: c# arrays string .net-2.0


【解决方案1】:

不是内置的,但很容易添加...

static readonly Random rand = new Random();
public static T GetRandomValue<T>(T[] values) {
    lock(rand) {
        return values[rand.Next(values.Length)];
    }
}

static 字段有助于确保我们在紧密循环中使用它时不会重复,而lock 可以确保它免受多个调用者的影响)

在 C# 3.0 中,这可能是一种扩展方法:

public static T GetRandomValue<T>(this T[] values) {...}

然后您可以完全按照您的示例使用它:

string[] fileLines = File.ReadAllLines(filePath);
string val = fileLines.GetRandomValue();

【讨论】:

  • 另一种方法是制作 rand [ThreadStatic] 并使用从系统时间和 ThreadID 派生的种子,并避免完全锁定...
  • 就个人而言,我认为将其添加为一个扩展方法有点滥用。应用程序中的所有 string[] 数组显然都不需要。
  • 我只说“可以”,从 OPs 问题中说明用法,扩展方法对代码性能没有累积成本。容器类可以在“Utils.Arrays”命名空间中,例如,严格限制范围。
  • 我知道;但我只是认为这是为什么扩展方法不好的一个典型例子:添加无用的方法来解决特定问题太容易了,而不是为了利益或整个应用程序添加新的通用功能。
  • 这对于我编写的需要从各种不同的列表和数组中选择随机元素的应用程序非常有帮助;所以在那种情况下不是没用的。
【解决方案2】:

确实。

Random m = new Random();
string line = fileLines[m.Next(0, fileLines.Length);

【讨论】:

    【解决方案3】:

    我不认为数组支持这样的功能。最简单的方法就是获取一个随机数,获取对应的item。

    Random rnd = new Random();
    String item = fileLines[rnd.next(fileLines.Length);
    

    【讨论】:

      【解决方案4】:

      试试:

      fileLines [new Random ().Next (fileLines.Length)]
      

      【讨论】:

      • 快速连续多次调用(例如,在紧密循环中)每次都会返回同一行。
      【解决方案5】:

      Linq To Sql 方式

      var rFile = fileLines.OrderBy(x => Guid.NewGuid()).FirstOrDefault();
      

      如果你看到错误,你应该添加 System.Linq;

      【讨论】:

        【解决方案6】:

        我会使用这种方法从数组中获取随机项:

        string[] str = {"red","blue","pink","yellow","green","brown"};
        int i = new Random.Next(0, str.length);
        MessageBox.Show(str[i]);
        

        【讨论】:

          猜你喜欢
          • 2012-07-20
          • 2012-06-09
          • 1970-01-01
          • 2011-09-12
          • 2011-04-07
          • 2010-11-12
          • 2019-03-12
          • 2012-02-17
          • 2013-08-13
          相关资源
          最近更新 更多