Случайный массив с использованием LINQ и C # - PullRequest
11 голосов
/ 31 октября 2008

Я читал статью в журнале MSDN об использовании перечисляемого класса в LINQ для генерации случайного массива. В статье используется VB.NET, и я не сразу уверен, что эквивалент в C #:

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

Ответы [ 6 ]

20 голосов
/ 31 октября 2008

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 . Для этого также доступны несколько других инструментов .

5 голосов
/ 31 октября 2008

Сначала я подумал, что это будет плохой идеей, поскольку алгоритм сортировки должен будет выполнить несколько сравнений для чисел, и он будет получать разные ключи сортировки для одного и того же числа каждый раз, когда он вызывает лямбду для этого числа. Однако, похоже, он вызывает его только один раз для каждого элемента в списке и сохраняет это значение для последующего использования. Этот код демонстрирует это:

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);
5 голосов
/ 31 октября 2008
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
4 голосов
/ 06 июля 2010

Как насчет чего-то гораздо более легкого ...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
1 голос
/ 01 ноября 2008

Используя C5 Generic Collection Library , вы можете просто использовать встроенный метод Shuffle():

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
1 голос
/ 31 октября 2008

Лучшее, что я могу сделать без головы в Visual Studio (скрещивает пальцы):

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