11

LINQ で Enumerable クラスを使用してランダムな配列を生成する方法について、MSDN Magazine で記事を読んでいました。この記事では 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# から VB.Net へのコンバーターも用意されています。このために利用できる他のツールもいくつかあります。

于 2008-10-31T20:32:04.060 に答える
5

ソートアルゴリズムは数値に対して複数の比較を行う必要があり、同じ数値のラムダを呼び出すたびに異なるソートキーを取得するため、これは最初は悪い考えだと思いました。ただし、リスト内の要素ごとに1回だけ呼び出し、後で使用するためにその値を保存しているように見えます。このコードはこれを示しています:

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 に答える
5
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
于 2008-10-31T20:32:02.627 に答える
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 に答える