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