Случайный массив с использованием LINQ и C #
-
05-07-2019 - |
Вопрос
Я читал в журнале MSDN статью об использовании класса Enumerable в LINQ для генерации случайного массива. В статье используется VB.NET, и я не сразу уверен, что эквивалент в C #:
Dim rnd As New System.Random()
Dim numbers = Enumerable.Range(1, 100). _
OrderBy(Function() rnd.Next)
Решение
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 а>. Для этого также доступно несколько других инструментов .
Другие советы
Сначала я подумал, что это будет плохой идеей, поскольку алгоритм сортировки должен будет выполнить несколько сравнений для чисел, и он будет получать разные ключи сортировки для одного и того же числа каждый раз, когда он вызывает лямбду для этого числа. Однако, похоже, он вызывает его только один раз для каждого элемента в списке и сохраняет это значение для последующего использования. Этот код демонстрирует это:
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);
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
Как насчет чего-то гораздо более легкого ...
Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
Лучшее, что я могу сделать, не касаясь Visual Studio (скрестив пальцы):
System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);
Используя C5 Generic Collection Library , вы можете просто использовать встроенный Shuffle ()
метод:
IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();