Skip to main content

Numeric Ordering | .NET 10, CSharp 14 | CSharp

  • Numeric Ordering | .NET 10, CSharp 14 | CSharp

Visão Geral

O Numeric Ordering introduzido no .NET 10 permite que sequências numéricas dentro de strings sejam comparadas como valores numéricos reais, e não como texto puro (comparação lexicográfica).

Esse comportamento é essencial para cenários onde identificadores contêm números incrementais, como:

  • Versionamento (v1, v2, v10)
  • Nomes de arquivos (file1, file20, file300)
  • Logs sequenciais
  • Identificadores mistos alfanuméricos

Problema da Ordenação Lexicográfica

A ordenação padrão de strings no .NET é baseada em comparação lexicográfica (ordinal ou cultural). Isso significa que a comparação ocorre caractere por caractere.

Exemplo:

var items = new[]
{
"file1",
"file2",
"file10"
};

Array.Sort(items);

foreach (var item in items)
{
Console.WriteLine(item);
}

Resultado:

file1
file10
file2

Motivo técnico:

  • "1" vem antes de "2"
  • A comparação é feita por código Unicode
  • O número não é interpretado como valor inteiro

Como o Numeric Ordering Funciona

Com Numeric Ordering:

  • O algoritmo detecta sequências contínuas de dígitos
  • Trata essas sequências como números inteiros
  • Compara os valores numericamente
  • Continua a comparação textual após o bloco numérico

Exemplo esperado:

file1
file2
file10

A comparação torna-se semanticamente correta do ponto de vista humano.


API no .NET 10

O recurso está disponível via CompareOptions.NumericOrdering.

Exemplo prático

using System;
using System.Globalization;

var comparer = StringComparer.Create(
CultureInfo.InvariantCulture,
CompareOptions.NumericOrdering
);

var items = new[]
{
"file1",
"file2",
"file10"
};

Array.Sort(items, comparer);

foreach (var item in items)
{
Console.WriteLine(item);
}

Saída:

file1
file2
file10

Comparação Técnica Entre Estratégias

Ordenação Ordinal

StringComparer.Ordinal

Características:

  • Extremamente rápida
  • Baseada em código Unicode
  • Não interpreta números

Ordenação Cultural

StringComparer.CurrentCulture

Características:

  • Respeita regras linguísticas
  • Ainda é lexicográfica
  • Não resolve ordenação numérica natural

Numeric Ordering

CompareOptions.NumericOrdering

Características:

  • Interpreta sequências numéricas como inteiros
  • Ideal para nomes de arquivos e versões
  • Levemente mais custosa que ordinal

Casos Reais

Versionamento

Sem Numeric Ordering:

v1
v10
v2

Com Numeric Ordering:

v1
v2
v10

Logs Sequenciais

Entrada:

log_9.txt
log_10.txt
log_11.txt

Ordenação correta com Numeric Ordering:

log_9.txt
log_10.txt
log_11.txt

Considerações de Performance

Numeric Ordering:

  • Exige inspeção caractere a caractere
  • Detecta blocos numéricos dinamicamente
  • Possui custo maior que StringComparer.Ordinal

Recomendação:

  • Utilize apenas quando houver números embutidos relevantes
  • Evite em hot paths críticos sem benchmark
  • Para grandes volumes, teste com BenchmarkDotNet

Quando Utilizar

Indicado quando:

  • A ordenação precisa refletir expectativa humana
  • Identificadores contêm números incrementais
  • Deseja evitar implementação manual de IComparer<string>

Não indicado quando:

  • Performance extrema é prioridade
  • Strings não possuem números
  • A ordenação precisa ser estritamente ordinal