Framework

7 out, 2025

Novidades do .NET 10: melhorias na ordenação numérica de strings

Publicidade

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:

Press enter or click to view image in full size

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!