【问题标题】:sort string array due to DayOfWeek由于 DayOfWeek 对字符串数组进行排序
【发布时间】:2019-08-05 08:31:58
【问题描述】:

我有一个字符串数组

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

我越来越想按照DayOfWeek排序。 例如,“1”是星期一,“2”是星期二,“6”是星期六。今天是星期四。 所以最近的一个是星期六,星期一,星期二。所以最终的数组将是

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

我找不到任何解决方案来对它们进行排序。我怎样才能对它们进行排序。

提前致谢。

【问题讨论】:

  • 这些是如何与Saturday,Monday,Tuesday. 和Thursday 最接近的?你的最近的一个背后的逻辑是什么?
  • 您必须编写一个自定义的 IComparer。
  • 我的意思是今天最近的一天它会被排序到今天星期六是最近的一天。周一晚,周二晚。@er-sho

标签: c# arrays sorting dayofweek


【解决方案1】:

您可以为此使用 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. 对每个组进行排序(升序)

【讨论】:

    【解决方案2】:

    String 解释起来有点复杂,所以我用 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

    【讨论】:

    • 那么,使用int.Parse 将int 从string 中取出会变得复杂吗?
    • 你看到副词a bit了吗?
    • 不,我所看到的只是不打电话给int.Parse 的一个有点奇怪的借口,你可能会看到所有其他给出的答案使用int.Parse - 你的说法有点奇怪。
    【解决方案3】:

    我不知道您是否想要就地排序,但如果您不想更改数组(或将更多处理链接到数组),那么您可以使用 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 方法中使用类似的逻辑

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多