11

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

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

6 回答 6

20

Developer Fusion VB.Net 到 C# 转换器说等效的 C# 代码是:

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

为了将来参考,他们还有一个C# to VB.Net 转换器。还有一些其他工具可用于此。

于 2008-10-31T20:32:04.060 回答
5
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
于 2008-10-31T20:32:02.627 回答
5

我最初认为这是一个坏主意,因为排序算法需要对数字进行多次比较,并且每次调用该数字的 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);
于 2008-10-31T20:52:18.903 回答
4

更简单的事情呢...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
于 2010-07-06T19:46:19.097 回答
1

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

System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);
于 2008-10-31T20:37:45.563 回答
1

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

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
于 2008-10-31T21:03:38.943 回答