2010-01-06 1 views
3

J'ai une liste de chaînes UTF-8 que je veux trier en utilisant Enumerable.OrderBy. Les chaînes peuvent contenir n'importe quel nombre de jeux de caractères - par exemple, anglais, allemand et japonais, ou un mélange d'entre eux, même.StringComparer.CurrentCulture est-il le bon choix à utiliser dans ce cas?

Par exemple, voici une liste d'entrée échantillon:

["東京","North 東京", "München", "New York", "Chicago", "大阪市"] 

Je suis confus quant à savoir si l'utilisation StringComparer.CurrentCulture est le paramètre de comparaison de chaîne de droite pour passer à OrderBy(). Que faire si la culture actuelle de l'application est en-US mais je veux toujours trier les données UTF-8 "correctement" au-delà des règles de tri en-US? Ma confusion provient probablement de ma compréhension de la fonction NLSSORT dans Oracle qui ne correspond pas tout à fait à la comparaison de chaînes .NET et à la sémantique de tri. Par exemple, la définition de NLS_SORT = Japanese_M signifie qu'il trierait correctement le latin, l'européen de l'ouest et le japonais, indépendamment du fait qu'un ou tous les caractères apparaissent dans une chaîne donnée dans la colonne triable.

Répondre

4

Il n'y a pas de comparaison unique qui fonctionne pour toutes les cultures.

À moins de détecter la langue et de choisir en conséquence, InvariantCulture est votre meilleur pari. En tant que document, vous liez des notes:

NE PAS: utiliser les opérations de chaîne StringComparison.InvariantCulture dans la plupart des cas; l'une des rares exceptions serait la persistance de données linguistiquement significatives mais culturellement agnostiques.

J'ai ajouté l'emphase. Cette exception est plus ou moins ce que vous faites.

+0

Vous dites que InvariantCulture est mon meilleur pari, mais ensuite le nier avec la citation de MSDN, dans ce cas, vous êtes d'accord avec nobugz, et je suggère que j'utilise CurrentCulture. Est-ce exact? –

+0

Non. Comme je l'ai dit, ce que vous faites semble tomber dans l'exception, donc je pense que la citation MSDN supporte l'utilisation de InvariantCulture dans ce cas précis. nobugz serait correct si la culture locale prédomine, mais si la liste est vraiment mélangée comme vous dites * et * est significatif pour l'utilisateur (probablement polyglotte), alors InvariantCulture est le meilleur choix. –

1

Gardez les yeux sur la balle: vous triez pour aider les humains à retrouver une chaîne dans une liste. Vous aurez besoin d'un linguiste qualifié pour connaître les règles de tri pour l'anglais, l'allemand et le japonais en même temps. Quelles sont les chances d'une pose des yeux sur votre liste? Assurez-vous toujours que la liste est triée en fonction des règles de culture locales et que le tri est localisé.

Questions connexes