2009-09-15 9 views
1

Je dois trier une liste de chaînes de la même manière qu'elles me sont renvoyées à partir d'une base de données Oracle. Malheureusement, Oracle les renvoie de telle manière que les caractères numériques sont triés par ordre alphabétique. Par exemple:C# tri des chaînes VS tri des chaînes Oracle

Alabama 
x-men 
100 new ideas 
9 months 
... 

Comment puis-je trier une liste de chaînes en C# d'une telle manière?

Répondre

0

Vous pouvez implémenter une classe personnalisée dérivée de StringComparer pour répliquer exactement les résultats.

Cependant, la chaîne d'Oracle tri est déterminée probablement par le classement utilisé dans la base de données/table/requête alors lorsque vous utilisez la même culture pour vous le tri peut obtenir les mêmes résultats déjà sans avoir recours à l'écriture trop sur votre propre.

0

Vous pouvez créer votre propre classe IComparer et utiliser cette instance pour trier votre liste de chaînes. A une méthode de membre 'Sort' qui prend un IComparer ou Comparision, dans lequel vous pouvez implémenter votre logique de commande.

3

Oracle peut trier de plusieurs façons. Par défaut, Oracle triera les chaînes (VARCHAR) de façon binaire, c'est-à-dire que les chaînes seront triées en fonction des valeurs numériques de chaque caractère du jeu de caractères de la base de données.

SQL> select * from nls_session_parameters where parameter like '%SORT%'; 

PARAMETER VALUE 
---------- ---------- 
NLS_SORT BINARY 

SQL> SELECT rownum, chr(ROWNUM) FROM dual CONNECT BY LEVEL <= 127 ORDER BY 2; 

    ROWNUM CHR(ROWNUM) 
---------- ----------- 
[...] 
     48 0 
     49 1 
     50 2 
     51 3 
[...] 
     65 A 
     66 B 
     67 C 
     68 D 
[...] 
     97 a 
     98 b 
     99 c 

Vous pouvez modifier le comportement de tri:

SQL> alter session set nls_sort=french; 

Session altered 

SQL> SELECT rownum, chr(ROWNUM) FROM dual CONNECT BY LEVEL <= 127 ORDER BY 2; 

    ROWNUM CHR(ROWNUM) 
---------- ----------- 
[...] 
     65 A 
     97 a 
     66 B 
     98 b 
[...] 
     90 Z 
     122 z 
     48 0 
     49 1 
     50 2 
[...]