If you have string
representations of rates to compare, you can use a trick: since
'+' == 0x2B
',' == 0x2C
'-' == 0x2D
we can compare left
and right
ratings by padding them with ','
: "X+" < "X," < "X-"
int compare = string.Compare(
left.PadRight(2, ','),
right.PadRight(2, ','),
StringComparison.OrdinalIgnoreCase);
For instance, let's sort out an array of ratings
given as string
s:
string[] ratings = new string[] {
"F-", "A+", "B", "B-", "B+", "A-", "F", "E"
};
// Inplace sorting
Array.Sort(ratings, (left, right) => string.Compare(
left.PadRight(2, ','),
right.PadRight(2, ','),
StringComparison.OrdinalIgnoreCase));
// Alternative Linq version
var sortedRatings = ratings
.OrderBy(rating => rating.PadRight(2, ','))
.ToArray();
Console.Write(string.Join(", ", ratings));
Outcome:
A+, A-, B+, B, B-, E, F, F-