1
votes

trier le tableau de chaînes en raison de DayOfWeek

J'ai un tableau de chaînes

days={ "6", "1", "2" }

Je veux le trier de plus en plus selon DayOfWeek . Par exemple, «1» est lundi, «2» est mardi, «6» est samedi. Nous sommes jeudi aujourd'hui. Le plus proche est donc samedi, lundi, mardi. Le tableau final sera donc

string[] days={ "1", "2", "6" }

Je ne peux trouver aucune solution pour les trier. Comment puis-je les trier?

Merci d'avance.


3 commentaires

Comment sont-ils les plus proches samedi, lundi, mardi. du jeudi ? Quelle logique derrière votre plus proche ?


Vous devrez écrire un IComparer personnalisé.


Je veux dire le jour le plus proche d'aujourd'hui. Il sera trié en fonction d'aujourd'hui. Lundi vient plus tard, mardi plus tard. @ Er-sho


3 Réponses :


1
votes

La chaîne est un peu complexe à expliquer, j'utilise donc int à la place.

Laissez le jour de la semaine toujours pas plus petit qu'aujourd'hui, puis comparez.

Array.Sort(days, (d1, d2) => (d1 < today ? d1 + 7 : d1).CompareTo(d2 < today ? d2 + 7 : d2));

Forme courte

int[] days = { 1, 2, 6 };
int today;
Array.Sort(days, (d1, d2) =>
{
    if(d1 < today)
       d1 += 7;
    if(d2 < today)
       d2 += 7;
    return d1.CompareTo(d2);
});

https://dotnetfiddle.net / QsVnIr


3 commentaires

Donc, utiliser int.Parse pour extraire int de string rend les choses complexes comment?


Voyez-vous l'adverbe un peu ?


Non, tout ce que je vois est une excuse un peu étrange pour ne pas appeler int.Parse , et comme vous pouvez le voir toutes les autres réponses données, utilisez int.Parse - votre déclaration est un peu impair.



2
votes

Vous pouvez utiliser LINQ pour cela:

string[] days = { "1", "2", "6" };

var today = (int)(DateTime.Now.DayOfWeek + 6) % 7;

var result = days
    .GroupBy(x => int.Parse(x) > today)
    .OrderByDescending(x => x.Key)
    .SelectMany(g => g.OrderBy(x => x));

Console.WriteLine("[{0}]", string.Join(", ", result));
# [6, 1, 2]

Ce qui fait ce qui suit:

  1. Divise les jours avant et après en deux groupes
  2. Trie (par ordre décroissant) les jours suivants avant les jours avant
  3. Trie (par ordre croissant) chaque groupe


0 commentaires

1
votes

Je ne sais pas si vous voulez un tri sur place ou non, mais au cas où vous ne voudriez pas changer votre tableau (ou enchaîner plus de traitement au tableau), vous pouvez utiliser LINQ pour trier le tableau < pre> XXX

Vous pouvez également utiliser une logique similaire dans la méthode Array.Sort , si vous souhaitez emprunter cette route


0 commentaires