【问题标题】:Sort by numbers first先按数字排序
【发布时间】:2016-01-02 07:00:18
【问题描述】:

我有一个清单如下

 var x = new List<string>() { "a", "1", "b", "2" };
 var sortedResultByNumeric = x
       .Select(s => new { OriginalString = s, 
                          ExtractNumbers = String.Join("", s.Where(Char.IsDigit)) })
       .OrderBy(o => o.ExtractNumbers).ToList();

输出是

a
b
1
2

但预期是

1
2
a
b

我该怎么做?

【问题讨论】:

    标签: c# .net string linq


    【解决方案1】:

    您看到和预期的输出基于OriginalString,因为ExtractNumbers "","","1","2",那么您应该OrderBy OriginalString

    var x = new List<string>() { "a", "1", "b", "2" };
    var sortedResultByNumeric = x
               .Select(s => new { OriginalString = s, ExtractNumbers = String.Join("", s.Where(Char.IsDigit)) })
              .OrderBy(o => o.OriginalString).ToList();
    

    输出:

    1

    2

    一个

    b

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      var myList = new List<string>() { "a", "1", "b", "2", "123", "cd", "12346", "657" };
      
      var nonNumericItems = myList.Where(item => !item.Any(i => Char.IsDigit(i)))
              .OrderBy(item => item);
      
      var numericItems = myList
              .Select(item => String.Join("", item.Where(Char.IsDigit)))
              .Where(item => !String.IsNullOrEmpty(item))
              .Select(item => Convert.ToInt32(item))
              .OrderBy(item => item)
              .Select(item => item.ToString());
      
      var result = numericItems
              .Union(nonNumericItems);
      
      result.ToList()
            .ForEach(Console.WriteLine);
      

      输出是:

      1、2、123、657、12346、a、b、cd

      P.S: 你没有在String.Join("", item.Where(Char.IsDigit) 告诉我们任何关于你的逻辑的额外解释。所以,我没有就此提出任何其他问题。

      【讨论】:

        【解决方案3】:

        如果您的列表仅包含 1 个字符的字符串,您可以按其 char 数值对它们进行排序:

        var x = new List<string>() { "a", "1", "b", "2" };
        var sorted = x.OrderBy(c => Convert.ToChar(c))
                      .ToList();
        
        foreach (var c in sorted)
            Console.WriteLine(c);
        
        // 1
        // 2
        // a
        // b
        

        【讨论】:

          【解决方案4】:

          这个解决方案可能看起来很复杂,但它适用于任何网络内置的排序方法。

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.Data;
          
          
          namespace ConsoleApplication63
          {
              class Program
              {
                  const string FILENAME = @"c:\temp\test.csv";
                  static void Main(string[] args)
                  {
                      List<AlphaNumberic> aN = new List<AlphaNumberic>() { "a", "1", "b", "2" };
                      aN.Sort((x, y) => x.CompareTo(y));
                  }
              }
              public class AlphaNumberic
              {
                  int results = 0;
                  public string alphaNumeric { get; set; }
                  public AlphaNumberic(string value)
                  {
                      this.alphaNumeric = value;
                  }
                  public static implicit operator string(AlphaNumberic d)
                  {
                      return d.alphaNumeric;
                  }
                  public static implicit operator AlphaNumberic(string d)
                  {
                      return new AlphaNumberic(d);
                  }
                  public int CompareTo(AlphaNumberic compareItem)
                  {
                      int thisNum;
                      int num;
                      if (int.TryParse(compareItem.alphaNumeric, out num))
                      {
                          if (int.TryParse(this.alphaNumeric, out thisNum))
                          {
                              //alphaNumeric and compareItem both integers;
                              results = thisNum.CompareTo(num);
                          }
                          else
                          {
                              //alphaNumeric not an integer and compareItem integers;
                              results = 1;
                          }
                      }
                      else
                      {
                          if (int.TryParse(this.alphaNumeric, out thisNum))
                          {
                              //alphaNumeric is an integer and compareItem not an integers;
                              results = -1;
                          }
                          else
                          {
                              //alphaNumeric not an integer and compareItem not an integers;
                              results = alphaNumeric.CompareTo(compareItem);
                          }
                      }
                      return results;
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-06-29
            • 1970-01-01
            • 2020-09-03
            • 2018-01-21
            • 1970-01-01
            • 2021-09-13
            • 1970-01-01
            • 1970-01-01
            • 2017-12-17
            相关资源
            最近更新 更多