按字母顺序对字符串中的数字进行排序

时间:2010-02-20 00:15:15

标签: c# asp.net sorting digits alphabetical

我们有一个标题列表,其中一些以数字开头(例如5种制作小部件的方法)。我们想把它当作“五种方式......”而不改变标题。我们知道有些电影场所会这样做,但我无法在网上找到有关如何操作的信息。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

存储原始标题和拼写标题。

select OriginalTitle from Movies order by spelledTitle

另请参阅:Convert integers to written numbers

答案 1 :(得分:1)

在计算机科学中,在学习编程时,有时会有一个将数字转换为文本的赋值。像:

526 = Fivehundredtwentysix

这可能是你在这种情况下需要的东西。

这是一项微不足道的任务,但这是一个很好的教训。

答案 2 :(得分:1)

创建自定义比较器,请参阅http://support.microsoft.com/kb/320727

基本上你想要做的是测试第一个字符是否为数字。如果它不仅仅是恢复到标准字符串比较,如果是,那么你可以做一些额外的处理来获得该数字的文本版本。

一旦你有这个,大多数排序算法将允许你通过比较器。

答案 3 :(得分:0)

扩展其他人的建议:

  1. 最困难的部分可能是将数字转换为表示该数字的英文字符串的代码--Sani的编程任务。我已经包含了一个可能不符合您要求的简化示例。
  2. 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 dalmations”变成“oneohone dalmations”和“12怒气冲冲的男人”变成“愤怒的男人”。可以从Wedge's solution to a slightly different problem构建更完整的解决方案。我没有测试过那个代码,它不是为了处理数字之后的字符串而设计的,但它可能是一个好的开始。

    1. 在现代C#(我认为3.0及更高版本)中,您可以将方法名称传递给Sort,而不是显式创建IComparable或IComparer。这与Michael的链接基本相同。另一个相关选项是匿名lambda expression,甚至不需要外部方法。就个人而言,我认为代码以这种方式读得更干净。
    2. 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);
          }
      }