Compartir a través de


Clase SortKey

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Una comparación que distingue la referencia cultural de dos cadenas depende de cada carácter de las cadenas que tengan varias categorías de pesos de ordenación, como scripts, alfabéticos, mayúsculas y minúsculas y pesos diacríticos. Una clave de ordenación actúa como repositorio de estos pesos para una cadena determinada.

El método CompareInfo.GetSortKey devuelve una instancia de la clase SortKey que refleja la asignación que distingue la referencia cultural de caracteres en una cadena especificada. El valor de un objeto SortKey es sus datos clave, que devuelve la propiedad KeyData. Estos datos clave constan de una serie de bytes que codifican la cadena, las reglas de ordenación específicas de la referencia cultural y las opciones de comparación especificadas por el usuario. Una comparación mediante claves de ordenación consta de una comparación bit a bit de los datos de clave correspondientes en cada clave de ordenación. Por ejemplo, si crea una clave de ordenación llamando al GetSortKey(String, CompareOptions) método con un valor de, una operación de comparación de CompareOptions.IgnoreCasecadenas que usa la clave de ordenación no distingue mayúsculas de minúsculas.

Después de crear una clave de ordenación para una cadena, se comparan las claves de ordenación llamando al método estático SortKey.Compare. Este método realiza una comparación simple de bytes por byte, por lo que es mucho más rápido que el método String.Compare o CompareInfo.Compare.

Nota:

Puede descargar las tablas de ponderación de ordenación, un conjunto de archivos de texto que contienen información sobre los pesos de caracteres usados en las operaciones de ordenación y comparación para los sistemas operativos Windows, la tabla de elementos de intercalación Unicode predeterminado, la tabla de ponderación de ordenación para Linux y macOS.

Consideraciones de rendimiento

Al realizar una comparación de cadenas, los métodos Compare y CompareInfo.Compare producen los mismos resultados, pero tienen como destino escenarios diferentes.

En un nivel alto, el método CompareInfo.Compare genera la clave de ordenación para cada cadena, realiza la comparación y, a continuación, descarta la clave de ordenación y devuelve el resultado de la comparación. Sin embargo, el método CompareInfo.Compare realmente no genera una clave de ordenación completa para realizar la comparación. En su lugar, el método genera los datos clave para cada elemento de texto (es decir, carácter base, par suplente o secuencia de caracteres combinado) en cada cadena. A continuación, el método compara los datos de clave de los elementos de texto correspondientes. La operación finaliza en cuanto se determina el resultado final de la comparación. Se calcula la información clave de ordenación, pero no se crea ningún objeto SortKey. Esta estrategia es económica en términos de rendimiento si ambas cadenas se comparan una vez, pero se vuelve costosa si se comparan muchas veces las mismas cadenas.

El método Compare requiere la generación de un objeto SortKey para cada cadena antes de realizar la comparación. Esta estrategia es costosa en términos de rendimiento para la primera comparación debido al tiempo y la memoria invertidos para generar los objetos SortKey. Sin embargo, resulta económico si se comparan muchas veces las mismas claves de ordenación.

Por ejemplo, supongamos que escribe una aplicación que busca en una tabla de base de datos la fila en la que la columna de índice basada en cadenas coincide con una cadena de búsqueda especificada. La tabla contiene miles de filas y la comparación de la cadena de búsqueda con el índice de cada fila tardará mucho tiempo. Por lo tanto, cuando la aplicación almacena una fila y su columna de índice, también genera y almacena la clave de ordenación del índice en una columna dedicada a mejorar el rendimiento de la búsqueda. Cuando la aplicación busca una fila de destino, compara la clave de ordenación de la cadena de búsqueda con la clave de ordenación de la cadena de índice, en lugar de comparar la cadena de búsqueda con la cadena de índice.

Consideraciones sobre la seguridad

El método CompareInfo.GetSortKey(String, CompareOptions) devuelve un objeto SortKey con el valor basado en una cadena y un valor CompareOptions especificados, y la referencia cultural asociada al objeto CompareInfo subyacente. Si una decisión de seguridad depende de una comparación de cadenas o un cambio de mayúsculas y minúsculas, debe usar el método CompareInfo.GetSortKey(String, CompareOptions) de la referencia cultural invariable para asegurarse de que el comportamiento de la operación sea coherente, independientemente de la configuración cultural del sistema operativo.

Siga estos pasos para obtener una clave de ordenación:

  1. Recupere la referencia cultural invariable de la propiedad CultureInfo.InvariantCulture.

  2. Recupere un CompareInfo objeto para la referencia cultural invariable de la CultureInfo.CompareInfo propiedad.

  3. Llame al método CompareInfo.GetSortKey(String, CompareOptions).

Trabajar con el valor de un objeto SortKey equivale a llamar al método Windows LCMapString con el valor de LCMAP_SORTKEY especificado. Sin embargo, para el objeto SortKey, las claves de ordenación de caracteres en inglés preceden a las claves de ordenación para los caracteres coreanos.

SortKey objetos se pueden serializar, pero solo para que puedan cruzar AppDomain objetos. Si una aplicación serializa un SortKey objeto, la aplicación debe volver a generar todas las claves de ordenación cuando haya una nueva versión de .NET.

Para obtener más información sobre la ordenación de claves, vea Unicode Technical Standard #10, "Algoritmo de intercalación Unicode" en el sitio web de Unicode Consortium.