【问题标题】:Sorting a collection of strings with special rules使用特殊规则对字符串集合进行排序
【发布时间】:2018-03-18 17:51:06
【问题描述】:

前言:我在工作中偶然发现了这个,并认为这是一个有趣的问题。

序言编辑:我们已经有了一个可行的解决方案,但我正在寻找其他方法来解决这个问题。


给定string的集合:

["2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018"]

我想按年份降序对该集合进行排序。

但是,我还想应用一个特殊规则,其中包含字符串 "New" 的年份必须在包含字符串 "Used" 的同一年之前。

预期结果:

["2018", "2017 New", "2017 Used", "2016 New", "2016 Used", "2015"]

假设:

  • 如果集合包含一个包含"New" 的给定年份字符串,则该集合将始终包含包含"Used" 的同一年份(反之亦然),并且永远不会单独包含年份。

    ["2017 New", "2017", "2016 Used", "2016"] // invalid input
    
  • 年份将在 1000-9999 范围内。


解决此问题的最佳方法是什么?


编辑

这是我们的解决方案:

var l = new[] { "2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018" };

var sorted = l.OrderByDescending(i => i.Replace("Used", "Ased")).ToArray();
// ["2018", "2017 New", "2017 Used", "2016 New", "2016 Used", "2015"]

【问题讨论】:

  • “2017 New”会一直排在“2017 Used”之前,所以可以简单的默认排序。
  • 你尝试过什么吗?我们没有做你的工作。
  • @Fabio 是的,但 OP 想要按降序排序。所以默认排序是2018, 2017 Used, 2017 New, etc etc
  • “我们最终得到了预期的结果。”那么问题出在哪里?
  • 排序 + 自定义排序 = IComparable.

标签: c# string linq sorting collections


【解决方案1】:

我会拆分你的字符串并使用这些部分进行排序

var inputx = new string[] { "2015", "2016 New", "2016 Used", "2017 New", "2017 Used", "2018" };

var outputx = inputx.OrderByDescending(x => x.Split()[0]).ThenBy(x=>x).ToArray();

【讨论】:

    【解决方案2】:

    要在"2017" 之前获得"2017 New",在"2017 Used" 之前获得"2017"

    string[] arr = {"2018", "2017 New", "2017", "2017 Used", "2016"}; 
    
    arr = arr.OrderByDescending(s => s.Split()[0]).ThenBy(s => !s.EndsWith(" New")).ToArray();
    

    或者就地排序可能更有效:

    Array.Sort(arr, (a, b) => b.Split()[0].CompareTo(a.Split()[0]) + 
                        b.EndsWith(" New").CompareTo(a.EndsWith(" New")));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2015-02-08
      • 2016-09-13
      • 1970-01-01
      • 2020-11-13
      • 2017-02-10
      • 2014-05-20
      相关资源
      最近更新 更多