.NET

11 jul, 2023

Novidades do .NET 8: alterando randomicamente a ordem de itens em Arrays e Spans

Publicidade

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!