Чтобы расширить предложения других людей:
- Самой сложной частью этого является, вероятно, код, который преобразует число в английскую строку, представляющую это число, - назначение Сани для программирования. Я включил упрощенный пример, который может не соответствовать вашим требованиям.
private static string[] digitnames = new string[]
{ "oh", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
private static string ReplaceDigits(string s)
{
string convertedSoFar = ""; //could use a StringBuilder if performance is an issue.
for (int charPos = 0; charPos < s.Length; charPos++)
{
if (char.IsNumber(s[charPos]))
{
//Add the digit name matching the digit.
convertedSoFar += digitnames[int.Parse(s[charPos].ToString())];
}
else
{
//we've reached the end of the numbers at the front of the string.
//Add back the rest of s and quit.
convertedSoFar += s.Substring(charPos);
break;
}
}
return convertedSoFar;
}
Этот код превращает «101 далматин» в «однонаправленный далматин», а «12 злых людей» в «двух злых людей» Может быть построено более полное решение, возможно, из решения Клинга немного другой проблемы . Я не тестировал этот код, и он не предназначен для обработки строки после цифр, но, вероятно, это хорошее начало.
- В современном C # (я думаю, 3.0 и выше) вы можете передать имя метода в Sort, а не явно создавать IComparable или IComparer. По сути, это та же идея, что и ссылка Майкла. Другой связанный параметр - это анонимное лямбда-выражение , которое даже не требует внешнего метода. Лично я думаю, что код читается более чисто таким образом.
private static int NumberReplacingCompare(string strA, string strB)
{
return ReplaceDigits(strA).CompareTo(ReplaceDigits(strB));
}
private static void OutputSortedStrings()
{
List strings = new List(File.ReadAllLines(@"D:\Working\MyStrings.txt")); //pull the strings from a file (or wherever they come from
strings.Sort(NumberReplacingCompare); //sort, using NumberReplacingCompare as the comparison function
foreach (string s in strings)
{
System.Console.WriteLine(s);
}
}