Novidades do .NET 10 | Neste novo artigo abordo uma melhoria envolvendo a ordenação de strings com conteúdo numérico, através de uma nova opção que foi incorporada ao enum CompareOptions (namespace System.Globalization): trata-se de CompareOptions.NumericOrdering, alternativa que pode ser utilizada em conjunto com a classe StringComparer (namespace System) em instruções que envolvam ordenação e comparação de valores numéricos em strings.
Podemos observar o uso de CompareOptions.NumericOrdering com StringComparer na listagem a seguir:
- Uma instância de StringComparer é gerada, recebendo como um dos parâmetros o valor CompareOptions.NumericOrdering (linhas 13 e 14);
- Ao acionarmos o método Equals nesta referência de StringComparer (linha 25) conseguimos determinar que 007 e 7 representam um mesmo valor, ao passo em que não há igualdade entre 30.49 e 30.489;
- Este tipo de comportamento também estará disponível para a utilização com o método Order em um array de strings (linha 34), com a correta ordenação de diferentes valores em texto que representam números de 6 a 10;
- E também com o método Contains, em um exemplo baseado no uso de uma instância do tipo HashSet (linha 41). Uma análise envolvendo a pesquisa do texto 10 identificará que o mesmo corresponde a 0010, um dos itens que compõem a instância mencionada.
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text.Json;
Console.WriteLine("***** Testes com .NET 10 | Numeric Ordering for String Comparison *****");
Console.WriteLine($"Versao do .NET em uso: {RuntimeInformation
.FrameworkDescription} - Ambiente: {Environment.MachineName} - Kernel: {Environment
.OSVersion.VersionString}");
Console.WriteLine();
Console.WriteLine("*** Testando Equals() ***");
StringComparer numericStringComparer = StringComparer.Create(
CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
var numbersEquality = new (string value1, string value2)[]
{
("007", "7"),
("8", "8"),
("020.5", "20.5"),
("30.49", "30.489")
};
foreach (var numbers in numbersEquality)
Console.WriteLine($"{numbers.value1} == {numbers.value2} ? " +
numericStringComparer.Equals(numbers.value1, numbers.value2));
Console.WriteLine();
Console.WriteLine("*** Testando Order() ***");
var dotnetVersions = new[] { "10.0", "7.0", "9", "8.0", "6" };
Console.WriteLine($"{nameof(dotnetVersions)} = {JsonSerializer.Serialize(dotnetVersions)}");
var dotnetVersionsOrdered = dotnetVersions.Order(numericStringComparer);
Console.WriteLine($"{nameof(dotnetVersionsOrdered)} = {JsonSerializer.Serialize(dotnetVersionsOrdered)}");
Console.WriteLine();
Console.WriteLine("*** Testando Contains() ***");
var csharpVersions = new HashSet<string>(numericStringComparer) { "08", "009", "0010", "011", "12", "13" };
for (int v = 7; v <= 14; v++)
Console.WriteLine($"A versao {v} do C# esta na lista? {csharpVersions.Contains($"{v}")}");
O resultado da execução desta aplicação de testes pode ser observado na imagem seguinte:

Esse exemplo foi disponibilizado em um repositório do GitHub:
https://github.com/renatogroffe/DotNet10-ConsoleApp-Numeric-Ordering-for-String-Comparison
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!