Comparaison de chaînes: InvariantCultureIgnoreCase vs OrdinalIgnoreCase? [dupliquer]

Cette question a déjà une réponse ici:

Quel serait le meilleur code:

int index = fileName.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase);

Ou

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase);
141
demandé sur RichardTowers 2010-05-01 15:00:08

4 réponses

Si vous voulez vraiment ne faire correspondre que le point, alors StringComparison.Ordinal serait le plus rapide, car il n'y a pas de différence de cas.

"Ordinal" n'utilise pas de règles de culture et/ou de boîtier qui ne sont pas applicables de toute façon sur un symbole comme un ..

32
répondu Hans Kesting 2018-06-24 09:42:11

Aucun code n'est toujours meilleur. Ils font des choses différentes, donc ils sont bons à des choses différentes.

InvariantCultureIgnoreCase utilise des règles de comparaison basées sur l'anglais, mais sans variations régionales. Ceci est bon pour une comparaison neutre qui prend toujours en compte certains aspects linguistiques.

OrdinalIgnoreCase compare les codes de caractères sans aspects culturels. Ceci est bon pour les comparaisons exactes, comme les noms de connexion, mais pas pour trier les chaînes avec des caractères inhabituels comme é ou ö. C'est aussi plus rapide car il n'y a pas de règles supplémentaires à appliquer avant de comparer.

203
répondu Guffa 2015-07-15 14:48:14

FXCop préfère généralement OrdinalIgnoreCase. Mais vos exigences peuvent varier.

Pour l'anglais, il y a très peu de différence. C'est lorsque vous vous promenez dans des langues qui ont différentes constructions de langage écrit que cela devient un problème. Je ne suis pas assez expérimenté pour vous donner plus que cela.

OrdinalIgnoreCase

Le StringComparer renvoyé par le Ordinalignorecase propriété traite les caractères dans les chaînes de comparez comme si elles étaient converties de majuscules en utilisant les conventions de la culture invariante, puis effectue une simple comparaison d'octets qui est indépendant de la langue. Ceci est le plus approprié lorsque comparaison des chaînes générées par programme ou lors de la comparaison ressources insensibles à la casse telles que les chemins et noms de fichiers. http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

Le StringComparer renvoyé par la InvariantCultureIgnoreCase propriété compare les chaînes d'un point de vue linguistique de manière pertinente qui ignore le cas, mais il ne convient pas pour l'affichage dans tout culture particulière. Ses principaux l'application consiste à commander des chaînes dans un façon qui sera identique à travers culture. http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

La culture invariante est la Objet CultureInfo renvoyé par le InvariantCulture propriété.

Le InvariantCultureIgnoreCase la propriété renvoie réellement une instance d'une classe anonyme dérivée du Classe StringComparer.

47
répondu Sky Sanders 2012-10-30 11:08:35

Vous semblez faire des comparaisons de noms de fichiers, donc j'ajouterais simplement que OrdinalIgnoreCase est le plus proche de ce que fait NTFS (ce n'est pas exactement la même chose, mais c'est plus proche de InvariantCultureIgnoreCase)

14
répondu Dean Harding 2010-05-01 13:13:56