【问题标题】:Custom sorting of a string array in C#C#中字符串数组的自定义排序
【发布时间】:2010-08-02 16:49:13
【问题描述】:

我有一个字符串数组或数组列表,它在 C# 中传递给我的程序。以下是这些字符串包含的一些示例:

“2009 年春季” 《2006年总和》 《2010 年秋季》 “2007 年秋季”

我希望能够按年份和季节对这个数组进行排序。有没有办法编写一个排序函数来告诉它按年份然后按季节排序。我知道如果他们分开会更容易,但我无法控制给我的东西。

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    您需要编写一个以适当方式比较任意两个字符串的方法,然后您可以将该方法转换为Comparison<string> 委托以传递给Array.Sort

    public static int CompareStrings(string s1, string s2)
    {
        // TODO: Comparison logic :)
    }
    ...
    
    string[] strings = { ... };
    Array.Sort(strings, CompareStrings);
    

    您也可以对通用列表做同样的事情:

    List<string> strings = ...;
    strings.Sort(CompareStrings);
    

    【讨论】:

      【解决方案2】:

      您可以通过空格字符拆分字符串,将两个部分都转换为整数,然后使用 LINQ:

      string[] seasons = new[] { "Spr", "Sum", "Fall", "Winter" };
      
      string[] args = new[] { "Spr 2009", "Sum 2006", "Fall 2010", "Fall 2007" };
      
      var result = from arg in args
                   let parts = arg.Split(' ')
                   let year = int.Parse(parts[1])
                   let season = Array.IndexOf(seasons, parts[0])
                   orderby year ascending, season ascending
                   select new { year, season };
      

      【讨论】:

      • 这行得通,只是它按字母顺序而不是季节的顺序排列季节。
      • 代码按季节数组中的季节索引排序,而不是按字母顺序。
      【解决方案3】:

      您总是可以将它们分开。创建名称-值-值三元组并像这样使用它们。如果数据格式一致,请使用 Left 和 Right 字符串函数。然后你先排序年份部分,然后是季节部分。虽然 Jon 的想法看起来非常好,但这是在该方法中添加什么的一个想法。

      【讨论】:

        【解决方案4】:

        我相信您正在寻找的是 StringComparer 类。

        【讨论】:

          【解决方案5】:
          var strings = new string[] {"Spr 2009", "Sum 2006", "Fall 2010", "Fall 2007"};
          var sorted = strings.OrderBy(s => 
          {
              var parts = s.Split(' ');
              double result = double.Parse(parts[1]);
              switch(parts[0])
              {
                  case "Spr":
                      result += .25;
                      break;
                  case "Sum"
                      result += .5;
                      break;
                  case "Fall":
                      result += .75;
                      break;
              }
              return result;
          });
          

          我也考虑过 Array.Sort,可能会快一点,但你也提到有时这些是 ArrayList。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-05-29
            • 2019-08-30
            • 1970-01-01
            • 2013-05-08
            • 2012-03-04
            • 2021-08-26
            • 1970-01-01
            • 2012-06-02
            相关资源
            最近更新 更多