A juzgar por los comentarios anteriores, que también se implementarían una clase personalizada IComparer<T>
. Según lo que puedo deducir, la estructura de los artículos es un número, una combinación de un número seguido de una (s) letra (s). Si este es el caso, la siguiente implementación IComparer<T>
debería funcionar.
public class CustomComparer : IComparer<string>
{
public int Compare(string x, string y)
{
var regex = new Regex("^(d+)");
// run the regex on both strings
var xRegexResult = regex.Match(x);
var yRegexResult = regex.Match(y);
// check if they are both numbers
if (xRegexResult.Success && yRegexResult.Success)
{
return int.Parse(xRegexResult.Groups[1].Value).CompareTo(int.Parse(yRegexResult.Groups[1].Value));
}
// otherwise return as string comparison
return x.CompareTo(y);
}
}
Con esta IComparer<T>
, usted será capaz de ordenar la lista de string
haciendo
var myComparer = new CustomComparer();
myListOfStrings.Sort(myComparer);
Esto ha sido probado con los siguientes elementos:
2, 1, 4d, 4e, 4c, 4a, 4b, A1, 20, B2, A2, a3, 5, 6, 4f, 1a
y da el resultado:
1, 1a, 2, 20, 4a, 4b, 4c, 4d, 4e, 4f, 5, 6, A1, A2, a3, B2
Romper el 'número' en sus componentes, a continuación, ordenar por eso. – leppie
sí, el tipo natural es lo que ur después. este es un duplicado según lo indicado por Jon. Un buen artículo sobre esto en http://zootfroot.blogspot.com.au/2009/09/natural-sort-compare-with-linq-orderby.html –
[Ordenamiento natural en C#] (http: //www.interact -sw.co.uk/iangblog/2007/12/13/natural-sorting) –