recortar - string c# ejemplos
Problema de clasificación de cadenas en C# (3)
Tengo List como este
List<string> items = new List<string>();
items.Add("-");
items.Add(".");
items.Add("a-");
items.Add("a.");
items.Add("a-a");
items.Add("a.a");
items.Sort();
string output = string.Empty;
foreach (string s in items)
{
output += s + Environment.NewLine;
}
MessageBox.Show(output);
La salida regresa como
-
.
a-
a.
a.a
a-a
donde como estoy esperando los resultados como
-
.
a-
a.
a-a
a.a
Alguna idea de por qué "aa" no viene antes de "aa" donde "a-" viene antes que "a".
El método Sort
de la clase List<>
basa en el comparador de string
predeterminado de .NET Framework, que en realidad es una instancia del CultureInfo
actual del Thread
.
CultureInfo
especifica el orden alfabético de los caracteres y parece que el predeterminado usa una orden diferente a la esperada.
Al ordenar, puede especificar un CultureInfo
específico, uno que sepa que coincidirá con sus requisitos de clasificación, muestra (cultura alemana):
var sortCulture = new CultureInfo("de-DE");
items.Sort(sortCulture);
Aquí se puede encontrar más información:
http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/system.stringcomparer.aspx
Si desea que su clasificación de cadenas se base en el valor de bytes real en oposición a las reglas definidas por la cultura actual, puede ordenar por Ordinal:
items.Sort(StringComparer.Ordinal);
Esto hará que los resultados sean consistentes en todas las culturas (pero producirá clasificaciones poco intuitivas de "14" antes de "9", que pueden ser o no lo que estás buscando).
Sospecho que en el último caso "-" se trata de una manera diferente debido a la configuración específica de la cultura (tal vez como un "guión" en lugar de "menos" en las primeras cadenas). MSDN advierte sobre esto:
La comparación utiliza la cultura actual para obtener información específica de la cultura, como las reglas de mayúsculas y minúsculas y el orden alfabético de los caracteres individuales. Por ejemplo, una cultura podría especificar que ciertas combinaciones de caracteres se traten como un solo carácter, o que los caracteres en mayúsculas y minúsculas se comparen de una manera particular, o que el orden de clasificación de un personaje dependa de los caracteres que lo preceden o lo siguen.
Ver también en esta página de MSDN :
.NET Framework utiliza tres formas distintas de clasificación: clasificación de palabras, clasificación de cadenas y clasificación ordinal. El tipo de palabra realiza una comparación de cadenas sensible a la cultura. Ciertos caracteres no alfanuméricos pueden tener pesos especiales asignados a ellos; por ejemplo, el guión ("-") puede tener un peso muy pequeño asignado de modo que "cooperativa" y "cooperativa" aparecen uno al lado del otro en una lista ordenada. El tipo de secuencia es similar al ordenamiento de palabras, excepto que no hay casos especiales; por lo tanto, todos los símbolos no alfanuméricos aparecen antes que todos los caracteres alfanuméricos. La clasificación ordinal compara cadenas basadas en los valores Unicode de cada elemento de la cadena.
Por lo tanto, el guión recibe un tratamiento especial en el modo de clasificación predeterminado para que la palabra se ordene más "natural".
Puede ordenar ordinal "normal" si lo activa específicamente:
Console.WriteLine(string.Compare("a.", "a-")); //1
Console.WriteLine(string.Compare("a.a", "a-a")); //-1
Console.WriteLine(string.Compare("a.", "a-", StringComparison.Ordinal)); //1
Console.WriteLine(string.Compare("a.a", "a-a", StringComparison.Ordinal)); //1
Para ordenar la colección original usando el uso de comparación ordinal:
items.Sort(StringComparer.Ordinal);