使用特殊规则对字符串集合进行排序

时间:2017-10-06 21:07:03

标签: c# string linq sorting collections

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

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

给出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"]

2 个答案:

答案 0 :(得分:3)

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

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();

答案 1 :(得分:1)

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

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")));