2017-10-06 202 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"))); 
相關問題