使用 LINQ 和 C# 的随机数组

Posted

技术标签:

【中文标题】使用 LINQ 和 C# 的随机数组【英文标题】:Random array using LINQ and C# 【发布时间】:2010-09-20 06:28:32 【问题描述】:

我在 MSDN 杂志上阅读了一篇关于使用 Enumerable class in LINQ 生成随机数组的文章。这篇文章使用 VB.NET,我不确定 C# 中的等价物是什么:

Dim rnd As New System.Random()
Dim numbers = Enumerable.Range(1, 100). _
    OrderBy(Function() rnd.Next)

【问题讨论】:

【参考方案1】:

Developer Fusion VB.Net to C# converter 表示等效的 C# 代码是:

System.Random rnd = new System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

为了将来参考,他们还有一个C# to VB.Net converter。也有 several other tools 可用于此。

【讨论】:

编辑为大家的组合。这是当时的最佳答案。我不是在玩最爱,只是保持干净。 好的,谢谢你告诉我。仅供参考,这是 James Curran 的代码。【参考方案2】:

我最初认为这是一个坏主意,因为排序算法需要对数字进行多次比较,并且每次调用该数字的 lambda 时,它都会为同一数字获得不​​同的排序键。但是,它看起来只为列表中的每个元素调用一次,并存储该值以供以后使用。这段代码演示了这一点:

int timesCalled = 0;
Random rnd = new Random();

List<int> numbers = Enumerable.Range(1, 100).OrderBy(r =>
   
       timesCalled++;
       return rnd.Next();
   
).ToList();

Assert.AreEqual(timesCalled, 100);

【讨论】:

【参考方案3】:
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

【讨论】:

嗯,我得到:嗯,我得到:方法 'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)' 不能从用法中推断出来。尝试明确指定类型参数。【参考方案4】:

更简单的事情呢……

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())

【讨论】:

【参考方案5】:

在没有访问 Visual Studio 的情况下我能做到的最好的事情(交叉手指):

System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);

【讨论】:

【参考方案6】:

使用C5 Generic Collection Library,您可以只使用内置的Shuffle() 方法:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();

【讨论】:

以上是关于使用 LINQ 和 C# 的随机数组的主要内容,如果未能解决你的问题,请参考以下文章

C# 将一个数组分成多个较小的数组(随机)

C#中如何从数组中获取一个随机数

随机选择一个数组 C# [关闭]

如何在 C# 数组字符串中选择 5 位随机数? [复制]

如何在 C# 中以相同的方式随机化/洗牌两个数组

用随机数计算数组中出现的次数,没有方法或 C# 中的列表