Estou tentando classificar uma matriz de números que são strings e gostaria que eles fossem classificados numericamente.
O problema é que não consigo converter os números em inteiros .
Aqui está o código:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
saída: 101, 102, 103, 105, 90
Eu gostaria: 90, 101, 102, 103, 105
EDIT: A saída não pode ser 090, 101, 102 ...
Atualizado o exemplo de código para dizer "coisas" em vez de "tamanhos". A matriz pode ser algo assim:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Isso significa que precisa ser classificado em ordem alfabética e por número:
007, 90, bob, lauren, paul
image10
vir depoisimage2
? DeveJanuary
vir antesFebruary
?Respostas:
Passe um comparador personalizado para OrderBy. Enumerable.OrderBy permitirá que você especifique qualquer comparador de sua preferência.
Esta é uma maneira de fazer isso:
fonte
IsNumeric
método é ruim, uma codificação conduzida por Exceções é sempre ruim. Use em seuint.TryParse
lugar. Teste seu código com uma lista grande e isso levará uma eternidade.Basta preencher com zeros do mesmo comprimento:
fonte
sizes
também não funcionaria, porque o resultado é um tipo diferente. A resposta é meio abreviada, pois a segunda linha mostra o resultado como uma expressão, mas cabe ao leitor fazer algo com ele. Eu adicionei outra atribuição de variável para deixar isso mais claro.E, que tal isso ...
fonte
"b", "ab", "101", "103", "bob", "abcd"
.O valor é uma string
Trabalho
fonte
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.Há uma função nativa no Windows
StrCmpLogicalW
que compara os números das strings como números em vez de letras. É fácil fazer um comparador que chama aquela função e a usa para suas comparações.Ele funciona até mesmo em strings com texto e números. Aqui está um programa de exemplo que irámostrar a diferença entre a classificação padrão e a
StrCmpLogicalW
classificaçãoquais saídas
fonte
-1 0 10 2
é classificado como0 -1 2 10
tente isso
Observação: isso será útil quando todas as strings forem conversíveis em int .....
fonte
ToList()
anterior =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Eu acho que isso será muito mais bom se tiver algum valor numérico na string. Espero que ajude.
PS: Não tenho certeza sobre desempenho ou valores de string complicados, mas funcionou bem em algo assim:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
fonte
Você diz que não pode converter os números em int porque a matriz pode conter elementos que não podem ser convertidos em int, mas não há mal em tentar:
Em seguida, compare assim:
Resultado: 007, 90, 90, 101, 102, 103, 105, bob, Lauren, Paul
fonte
Este parece um pedido estranho e merece uma solução estranha:
fonte
Este site discute a classificação alfanumérica e classificará os números em um sentido lógico em vez de um sentido ASCII. Ele também leva em consideração os alfas ao seu redor:
http://www.dotnetperls.com/alphanumeric-sorting
EXEMPLO:
O código é o seguinte:
fonte
A resposta dada por Jeff Paulsen está correta, mas
Comprarer
pode ser muito simplificada para isto:Isso funciona porque a única coisa que é verificada para o resultado de
Comparer
é se o resultado é maior, menor ou igual a zero. Pode-se simplesmente subtrair os valores de outro e não precisa lidar com os valores de retorno.Além disso, o
IsNumeric
método não deve ter que usar umtry
-block e pode se beneficiar deleTryParse
.E para aqueles que não têm certeza: Este Comparador classificará os valores de forma que os valores não numéricos sejam sempre anexados ao final da lista. Se alguém os quiser no início, o segundo e o terceiro
if
bloco devem ser trocados.fonte
Experimente isto:
fonte
arr = arr.OrderBy (x => x, novo NaturalSort ()). ToArray ();
O motivo pelo qual eu precisava era para ser arquivado em um diretório cujos nomes de arquivo começavam com um número:
fonte
Agora classifique as listas e mescle-as de volta ...
Só tentei dar uma contribuição nesta questão interessante ...
fonte
Minha solução preferida (se todas as strings forem apenas numéricas):
fonte
fonte
Expandindo a resposta de Jeff Paulsen. Eu queria ter certeza de que não importava quantos grupos de números ou caracteres existissem nas strings:
Eu também peguei SplitCharsAndNums de uma página do SO depois de alterá- la para lidar com nomes de arquivos.
fonte
Embora esta seja uma questão antiga, gostaria de dar uma solução:
Woha bem simples, certo? : D
fonte
fonte