2017-10-06 4 views
-2

Préface: Je suis tombé sur ce sujet au travail et j'ai pensé que c'était un problème intéressant.Trier une collection de chaînes avec des règles spéciales

Préface EDIT: Nous avons déjà une solution de travail, mais je suis à la recherche d'autres solutions.


Étant donné une collection de string:

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

Je veux trier cette collection dans l'ordre décroissant par année.

Cependant, je souhaite également appliquer une règle spéciale, où une année contenant la chaîne "New" doit précéder la même année contenant la chaîne "Used".

Résultat escompté:

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

Hypothèses:

  • Si la collection contient une chaîne année donnée contenant "New", la collection contiendra toujours cette même année contenant "Used" (et vice versa), et ne contiendra jamais l'année par lui-même.

    ["2017 New", "2017", "2016 Used", "2016"] // invalid input 
    
  • Les années seront à portée 1000-9999.


Quelle est la meilleure façon d'aborder ce problème?


EDIT:

Voici notre solution:

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 Nouveau » sera toujours avant « 2017 d'occasion », vous pouvez trier simplement par défaut tri. – Fabio

+0

Avez-vous déjà essayé quelque chose? Nous ne faisons pas votre travail. – HimBromBeere

+1

@Fabio Oui, mais OP veut trier dans l'ordre décroissant. Donc, avec le tri par défaut, il serait «2018, 2017 utilisé, 2017 nouveau, etc etc» – maccettura

Répondre

3

Je diviser votre chaîne et en utilisant sorte que les parties

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

Pour obtenir "2017 New" avant "2017", et "2017" avant "2017 Used":

string[] arr = {"2018", "2017 New", "2017", "2017 Used", "2016"}; 

arr = arr.OrderByDescending(s => s.Split()[0]).ThenBy(s => !s.EndsWith(" New")).ToArray(); 

ou en place genre pourrait être un peu plus efficace:

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