C #, operación de comparación de cadenas

C #, operación de comparación de cadenas

https://www.cnblogs.com/junbird-nest/archive/2012/03/23/2413557.html

operación de comparación de cadenas es más comúnmente utilizado, en general, por dos razones comparan cadenas:

  • Por la igualdad
  • cadena de clasificación

cadena de consulta API para la igualdad o ordenadas, por el siguiente método:

 

      bool public override equals (Object obj); 
        public bool Equals (valor de cadena); 
        public static bool Equals (cadena a, String b); 
        public bool Equals (valor de cadena, StringComparison comparisonType); 
        public static bool Equals (cadena a, b cadena, StringComparison comparisonType); 

        int public static comparación (cadena Stra, cadena strB); 
        int public static comparación (cadena Stra, cadena strB, bool ignoreCase); 
        int public static comparación (cadena Stra, cadena strB, StringComparison comparisonType); 
        int public static comparación (cadena Stra, cadena strB, bool ignoreCase, la cultura CultureInfo);
        int public static comparación (cadena Stra, strB cadena, la cultura CultureInfo, opciones CompareOptions);
        int public static comparación (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud); 
        int public static comparación (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud, bool ignoreCase); 
        int public static comparación (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud, StringComparison comparisonType); 
        int public static comparación (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud, bool ignoreCase, la cultura CultureInfo); 
        int public static comparación (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud, la cultura CultureInfo, CompareOptions opciones);

        int public static CompareOrdinal (cadena Stra, cadena strB);
        public static int CompareOrdinal (cadena Stra, int indiceA, cadena strB, int indiceB, int longitud); 

        int público CompareTo (valor de objeto); 
        public int CompareTo (cadena strB);

Encontrado en la mayoría de los métodos anteriores tienen tipo StringComparison de enumeración, obtener el MSDN consulta:

StringComparison

Ahora escribe un simple trozo de código, el método de ensayo de comparación (cadena Stra, cadena strB, StringComparison comparisonType). Fueron utilizados StringComparison.CurrentCulture y StringComparison.Ordinal. Código es el siguiente:

      static void Main (string [] args) 
       { 
           string strA = "asdfadsfasdfew我ò啊地方的asd????"; 
           strB cadena = "adsfeaqfaead啊多a发¢安2德森-efadsfa??"; 
           Cronómetro sw = new Cronómetro (); 

           sw.Start (); 
           for (int i = 0; i <1.000.000; i ++) 
           { 
               string.Compare (strA, strB, StringComparison.CurrentCulture); 
           } 
           Sw.Stop (); 
           Console.WriteLine (sw.ElapsedMilliseconds); 
           
           sw.Reset (); 
           for (int i = 0; i <1.000.000; i ++) 
           { 
               string.Compare (strA, strB, StringComparison.Ordinal); 
           }
           sw.Stop ();
           Console.WriteLine (sw.ElapsedMilliseconds); 

           sw.Reset (); 
           for (int i = 0; i <1.000.000; i ++) 
           { 
               string.CompareOrdinal (strA, strB); 
           } 
           Sw.Stop (); 
           Console.WriteLine (sw.ElapsedMilliseconds); 
       }

resultados de la ejecución son las siguientes:

resultado

Los resultados son muy evidentes, StringComparison.Currentculture pasan explícitamente la lengua y la cultura actual, y pasaron String.Ordinal ignorará la lengua y la cultura especificada, que es uno de la manera más rápida para realizar cadena.

Uso .NET Reflector para ver el código fuente:

int public static comparación (cadena Stra, cadena strB, StringComparison comparisonType) 
        { 
            if ((comparisonType <StringComparison.CurrentCulture) || (comparisonType> StringComparison.OrdinalIgnoreCase)) 
            { 
                throw new ArgumentException (Environment.GetResourceString ( "NotSupported_StringComparison"), "comparisonType "); 
            } 
            Si (== strA strB) 
            { 
                return 0; 
            } 
            Si (strA == null) 
            { 
                return -1; 
            } 
            Si (strB == null) 
            { 
                return 1;
            } 
            Interruptor (comparisonType) 
            { 
                caso StringComparison.CurrentCulture: 
                    CultureInfo.CurrentCulture.CompareInfo.Compare retorno (Stra, strB, CompareOptions.None); 

                caso StringComparison.CurrentCultureIgnoreCase: 
                    CultureInfo.CurrentCulture.CompareInfo.Compare retorno (strA, strB, CompareOptions.IgnoreCase); 

                caso StringComparison.InvariantCulture: 
                    retorno CultureInfo.InvariantCulture.CompareInfo.Compare (strA, strB, CompareOptions.None); 

                StringComparison.InvariantCultureIgnoreCase caso:
                    retorno CultureInfo.InvariantCulture.CompareInfo.Compare (strA, strB, CompareOptions.IgnoreCase); 

                StringComparison.Ordinal caso:
                    retorno CompareOrdinalHelper (strA, strB); 

                StringComparison.OrdinalIgnoreCase caso: 
                    if (!! strA.IsAscii () || strB.IsAscii ()) 
                    { 
                        retorno TextInfo.CompareOrdinalIgnoreCase (Stra, strB); 
                    } 
                    Devolver CompareOrdinalIgnoreCaseHelper (Stra, strB); 
            } 
            Arrojar nueva NotSupportedException (Environment.GetResourceString ( "NotSupported_StringComparison")); 
        }
En el ejemplo anterior, mientras que el CompareOrdinal Cadena métodos, la misma eficacia sorprendente prueba. Después de una revisión del código fuente y encontrar el código fuente String.Ordinal método de comparación, este método es sólo un caso especial del método de comparación:
 
int public static CompareOrdinal (cadena Stra, cadena strB) 
        { 
            si (== strA strB) 
            { 
                return 0; 
            } 
            Si (strA == null) 
            { 
                return -1; 
            } 
            Si (strB == null) 
            { 
                return 1; 
            } 
            Devolver CompareOrdinalHelper (Stra, strB); 
        }

 

 

A continuación, consulte el método String.compareTo fuente ():

[TargetedPatchingOptOut ( "Rendimiento crítico para inline través NGEN límites de la imagen")] 
       public int CompareTo (strB cadena) 
       { 
           si (strB == null) 
           { 
               return 1; 
           } 
           Devolver CultureInfo.CurrentCulture.CompareInfo.Compare (esto, strB, CompareOptions.None); 
       }

El mismo tipo de parámetros StringComparison.CurrentCulture método Compare.

 

 

Además StringComparer método de comparación de cadenas también implementa el método de comparación (). mirada directa en el código fuente:

public int Comparar (objeto x, y) objeto 
      { 
          si (x == y) 
          { 
              return 0; 
          } 
          Si (x == null) 
          { 
              return -1; 
          } 
          Si (y == null) 
          { 
              return 1; 
          } 
          String str = x como cadena; 
          si (str! = null) 
          { 
              string str2 = y como cadena; 
              if (! str2 = null) 
              { 
                  volver this.Compare (str, str2); 
              } 
          } 
          IComparable comparable = x como IComparable;
          si (null == comparable) 
          { 
              throw new ArgumentException (Environment.GetResourceString ( "Argument_ImplementIComparable")); 
          } 
          Devolver comparable.CompareTo (y); 
      }

 

 

Si el programa es sólo para cadena de codificación interna, tales como nombre de ruta, nombre de archivo, URL, variables de entorno, la reflexión, las marcas XML, estas cadenas son por lo general sólo en el uso de los procedimientos internos, el usuario no le gusta el programa, se debe utilizar cuerdas. ordinal o uso String.CompareOrdinal método ()

 

Resumen y Recomendaciones:

  1. Mostrar el uso de funciones sobrecargadas especifica reglas de comparación de cadenas. En general, con los parámetros requeridos de las sobrecargas de tipo StringComparison
  2. Cuando se compara con la cultura cadena desconocida, y el uso StringComparison.OrdinallgnoreCase StringComparison.Ordinal como un defecto, para mejorar el rendimiento
  3. Cuando un usuario como salida, una cadena basada StringComparison.CurrentCulture
  4. Utilice String.Equals Ejecución sólida y robusta a prueba si dos cadenas son iguales.
  5. No utilice una versión de alta resistencia String.Compare CompareTo o para detectar el valor de retorno es igual a 0 para determinar si la cadena. Estas dos funciones se utilizan para la comparación de cadenas, en lugar de ser comprobados por la igualdad.
  6. Al comparar las cadenas, las cadenas deben ser estandarizados función String.ToUpperInvariant sin método ToLowerInvariant, porque el capital ejecución de código Microsoft de comparación fueron optimizados. ¿Por qué no ToUpper y ToLower método, debido a su sensibilidad a la lengua y la cultura.

 

 

 

 

 

Publicado 80 artículos originales · ganado elogios 38 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/kuangben2000/article/details/104676667
Recomendado
Clasificación