前言:我在工作中偶然发现了这一点并认为这是一个有趣的问题。
前言编辑:我们已经有了一个有效的解决方案,但我正在寻找其他方法来解决这个问题。
给出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"]
答案 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")));