Przechodzenie przez poprzednie komentarze, chciałbym również zaimplementować niestandardową klasę IComparer<T>
. Z tego, co mogę zebrać, struktura pozycji jest albo liczbą, połączeniem liczby, po której następuje litera (y). W takim przypadku należy wykonać następującą implementację IComparer<T>
.
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);
}
}
Dzięki tej IComparer<T>
, będziesz w stanie uporządkować listę string
wykonując
var myComparer = new CustomComparer();
myListOfStrings.Sort(myComparer);
został przetestowany z następujących elementów:
2, 1, 4d, 4e, 4c, 4a, 4b, A1, 20, B2, A2, a3, 5, 6, 4f, 1a
i daje wynik:
1, 1a, 2, 20, 4a, 4b, 4c, 4d, 4e, 4f, 5, 6, A1, A2, a3, B2
Break 'numer' do komponentów, a następnie sortować według tego. – leppie
tak, naturalny rodzaj jest po tym. jest to duplikat, jak stwierdził Jon. Dobry artykuł na ten temat na http://zootfroot.blogspot.com.au/2009/09/natural-sort-compare-with-linq-orderby.html –
[Natural Sorting in C#] (http: //www.interact -sw.co.uk/iangblog/2007/12/13/natural-sorting) –