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!




