сортировать массив строк благодаря DayOfWeek - PullRequest
2 голосов
/ 14 марта 2019

У меня есть строковый массив

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

Я хочу отсортировать его по DayOfWeek все чаще.Например, «1» - понедельник, «2» - вторник, «6» - суббота.Сегодня четверг.Так что ближайший суббота, понедельник, вторник.Таким образом, окончательный массив будет

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

Я не могу найти решение для их сортировки.Как мне их отсортировать.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Для этого можно использовать LINQ:

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]

Что делает следующее:

  1. Разбивает дни до и после на две группы
  2. Сортировки (по убыванию) последующие дни до предшествующие дни
  3. Сортировка (возрастание) каждой группы
1 голос
/ 14 марта 2019

Я не знаю, хотите ли вы выполнить сортировку на месте или нет, но в случае, если вы не хотите изменять свой массив (или связывать дополнительную обработку с массивом), вы можете использовать LINQ для сортировки массива

var today = (int)DayOfWeek.Thursday;
int weekDays = 7;
string[] days = { "1", "2", "6" };
var sortedDays = days.Select(int.Parse).OrderBy(d => d > today ? d - today : d + weekDays - today);

Вы можете использовать аналогичную логику и в методе Array.Sort, если хотите пойти по этому пути

1 голос
/ 14 марта 2019

Строка немного сложна для объяснения, поэтому вместо нее я использую int.

Пусть день недели всегда не меньше сегодняшнего, тогда сравните.

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);
});

Краткая форма

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

https://dotnetfiddle.net/QsVnIr

...