O trabalho com arrays e spans pode levar à necessidade de embaralhar os diferentes itens que compõem estruturas desse tipo, com uma reorganização que aconteça de forma randômica. Existe inclusive um algoritmo para isto, conhecido como Fisher-Yates shuffle ou Knuth shuffle. Funcionalidades para sorteio e testes aleatórios constituem bons exemplos desta implementação.
Com o .NET 8 foi adicionada uma nova capacidade à classe Random(namespace System) que oferece uma resposta a tais demandas. Trata-se do método Shuffle, acessível por meio da propriedade Shared.
As sobrecargas disponibilizadas para Shuffle permitem seu uso com arrays e spans, como demonstrado na listagem a seguir (linhas 19 e 34):
1 using System.Runtime.InteropServices; |
2 using System.Text.Json; |
3 |
4 Console.WriteLine(“***** Testes com .NET 8 | Metodo Random.Shared.Shuffle *****”); |
5 Console.WriteLine(#8221;Versao do .NET em uso: {RuntimeInformation |
6 .FrameworkDescription} – Ambiente: {Environment.MachineName} – Kernel: {Environment |
7 .OSVersion.VersionString}“); |
8 |
9 Console.WriteLine(); |
10 Console.WriteLine(“** Testes com string[]”); |
11 var sugestoesCidades = new string[] |
12 { |
13 “Sao Paulo”, “Nova York”, “Roma”, “Cairo”, “Paris”, “Toquio” |
14 }; |
15 Console.WriteLine(#8221;{nameof(sugestoesCidades)} – valor original = “ + |
16 JsonSerializer.Serialize(sugestoesCidades)); |
17 for (int i = 1; i <= 3; i++) |
18 { |
19 Random.Shared.Shuffle(sugestoesCidades); |
20 Console.WriteLine(#8221;{nameof(sugestoesCidades)} – Shuffle {i}/3 = “ + |
21 JsonSerializer.Serialize(sugestoesCidades)); |
22 } |
23 |
24 Console.WriteLine(); |
25 Console.WriteLine(“** Testes com Span<string>”); |
26 var sugestoesPratos = new Span<string>(new string[] |
27 { |
28 “Pizza”, “Spaghetti”, “Costela bovina”, “Sopa”, “Bacon”, “Esfiha”, “Feijoada” |
29 }); |
30 Console.WriteLine(#8221;{nameof(sugestoesPratos)} – valor original = “ + |
31 JsonSerializer.Serialize(sugestoesPratos.ToArray())); |
32 for (int i = 1; i <= 3; i++) |
33 { |
34 Random.Shared.Shuffle(sugestoesPratos); |
35 Console.WriteLine(#8221;{nameof(sugestoesPratos)} – Shuffle {i}/3 = “ + |
36 JsonSerializer.Serialize(sugestoesPratos.ToArray())); |
37 } |
Ao executarmos este exemplo o array sugestoesCidades e o span sugestoesPratos serão embaralhados por 3 vezes cada, produzindo um resultado similar ao da imagem seguinte (utilizando o Visual Studio 2022):
Uma nova execução obviamente trará novos resultados, com diferentes ordenações:
Essa aplicação de testes foi disponibilizada no GitHub:
https://github.com/renatogroffe/DotNet8-ConsoleApp-RandomShuffle
Caso achem útil esta solução, peço por favor uma estrela no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!