2017-10-06 116 views
-2

前言:我偶然发现了这个工作,并认为这是一个有趣的问题。对特定规则的字符串集合进行排序

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


鉴于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"] 
+1

“2017年新的”将永远之前的“2​​017年二手”,因此默认情况下,你可以简单梳理它排序。 – Fabio

+0

你甚至尝试过什么吗?我们没有做你的工作。 – HimBromBeere

+1

@Fabio是的,但是OP想按降序排列。所以默认排序是'2018,2017已用,2017新等,等' – maccettura

回答

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

"2017"之前获得"2017 New",和"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"))); 
相关问题