【问题标题】:How to sort number in alphanumeric如何对字母数字中的数字进行排序
【发布时间】:2011-02-06 20:34:15
【问题描述】:

输入:

SHC 111U,SHB 22x,, SHA 5555G

需要的输出:

SHB 22X、SHC 111U、SHA 5555G

我只需要在停车场中对Vehicle no 进行排序,而不是前缀和后缀字母

【问题讨论】:

    标签: c# sorting alphanumeric


    【解决方案1】:

    http://dotnetperls.com/alphanumeric-sorting 的出色、优化的开源解决方案

    【讨论】:

      【解决方案2】:

      如果可能有没有号码的车牌,那么你应该检查一下。

      static int SortPlate(string plate)
      {
          int plateNumber;
          Regex regex = new Regex(@"\d+");
          Int32.TryParse(regex.Match(plate).Value, out plateNumber);
      
          return plateNumber;
      }
      
      static void Main(string[] args)
      {
          IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G", "HOT STUFF"};
      
          var sortedList = from z in data
                           orderby SortPlate(z)
                           select z;
      
          foreach (string plate in sortedList)
          {
              Console.WriteLine(plate);
          }
      
      }
      

      如果这绝对不可能,并且世界末日会在没有数字的盘子出现之前到来,那么这种缩短的形式将起作用:

      static void Main(string[] args)
      {
          IEnumerable<string> data = new List<string>() {"SHC 111U", "SHB 22x", "SHA 5555G"};
      
          Regex regex = new Regex(@"\d+");
          var sortedList = from z in data
                           orderby Int32.Parse(regex.Match(z).Value)
                           select z;
      
          foreach (string plate in sortedList)
          {
              Console.WriteLine(plate);
          }
      
      }
      

      【讨论】:

        【解决方案3】:

        使用接受IComparer 对象的Sort 方法并将您的车辆编号集合传递给它。您将需要定义一个实现 IComparer 的自定义类。在该类的 Compare 方法中,您可以编写代码来比较两个车辆编号。您可能应该使用正则表达式来提取车辆编号的数字部分。

        【讨论】:

          【解决方案4】:

          这样做的一个好方法是做这样的事情

          编写一个正则表达式以仅匹配名称的数字部分,将其放入成对整数值的集合中,第一个是您从字符串中提取的数字,第二个是原始列表中数字的索引.然后对第二个列表进行排序,然后使用集合中的第二个数字对第一个列表重新排序。

          【讨论】:

            【解决方案5】:

            没有任何内置功能可以做到这一点,但您可以通过首先提取数字并基于此进行排序来做到这一点。例如:

            class VehicleNumberComparer : IComparer<string>
            {
                public int Compare(string lhs, string rhs)
                {
                    var numExtract = new Regex("[0-9]+");
                    int lhsNumber = int.Parse(numExtract.Match(lhs).Value);
                    int rhsNumber = int.Parse(numExtract.Match(rhs).Value);
                    return lhsNumber.CompareTo(rhsNumber);
                }
            }
            

            这是未经测试的(甚至可能不经过修改就无法编译),没有错误检查,可能不是世界上最快的方法,但应该给你一个想法。

            【讨论】:

            • 谢谢你的建议,我会试试的
            • @Dean Harding,+1谢谢你的想法。
            猜你喜欢
            • 1970-01-01
            • 2021-09-19
            • 1970-01-01
            • 2015-10-14
            • 1970-01-01
            • 2016-08-13
            • 1970-01-01
            • 2011-07-25
            相关资源
            最近更新 更多