-2

我有一个总共 14 天的 DateTime 列表。每天有2次。

此列表按日期时间排序。

DateTime             DayofWeek
16-03-2021 08:00     Tuesday
16-03-2021 20:00     Tuesday
17-03-2021 08:00     Wednesday
17-03-2021 20:00     Wednesday
18-03-2021 08:00     Thursday
18-03-2021 20:00     Thursday
19-03-2021 08:00     Friday
19-03-2021 20:00     Friday
20-03-2021 08:00     Saturday
20-03-2021 20:00     Saturday
21-03-2021 08:00     Sunday
21-03-2021 20:00     Sunday
22-03-2021 08:00     Monday
22-03-2021 20:00     Monday
23-03-2021 08:00     Tuesday
23-03-2021 20:00     Tuesday
24-03-2021 08:00     Wednesday
24-03-2021 20:00     Wednesday
25-03-2021 08:00     Thursday
25-03-2021 20:00     Thursday
26-03-2021 08:00     Friday
26-03-2021 20:00     Friday
27-03-2021 08:00     Saturday
27-03-2021 20:00     Saturday
28-03-2021 08:00     Sunday
28-03-2021 20:00     Sunday
29-03-2021 08:00     Monday
29-03-2021 20:00     Monday

但是,我想每隔 7 天按星期几对它进行排序。(总是星期一优先)

预期结果 :

DateTime            DayofWeek
22-03-2021 08:00    Monday
22-03-2021 20:00    Monday
16-03-2021 08:00    Tuesday
16-03-2021 20:00    Tuesday
17-03-2021 08:00    Wednesday
17-03-2021 20:00    Wednesday
18-03-2021 08:00    Thursday
18-03-2021 20:00    Thursday
19-03-2021 08:00    Friday
19-03-2021 20:00    Friday
20-03-2021 08:00    Saturday
20-03-2021 20:00    Saturday
21-03-2021 08:00    Sunday
21-03-2021 20:00    Sunday
29-03-2021 08:00    Monday
29-03-2021 20:00    Monday
23-03-2021 08:00    Tuesday
23-03-2021 20:00    Tuesday
24-03-2021 08:00    Wednesday
24-03-2021 20:00    Wednesday
25-03-2021 08:00    Thursday
25-03-2021 20:00    Thursday
26-03-2021 08:00    Friday
26-03-2021 20:00    Friday
27-03-2021 08:00    Saturday
27-03-2021 20:00    Saturday
28-03-2021 08:00    Sunday
28-03-2021 20:00    Sunday

最好的排序方法是什么?

提前致谢。

4

1 回答 1

0

您的规范不完整。

  • 能保证你的约会没有漏洞吗?
  • 有没有遗漏的条目?每个 Date 正好有两个值?
  • 我们序列的第一天是星期二,还是您的序列从星期六开始。在这种情况下你想要什么:第一周只有周六和周日?

但是让我们假设:没有漏洞,没有重复,序列按 DateTime 排序,每一天恰好有两个 Datetime,第一个值是在 TuesDay 上(我几乎不认为这些先决条件是一个有用的商业模式,但是嘿,这是你的问题!)

因此,鉴于这些先决条件,您首先要将您的序列划分为 7 天(14 个日期时间)。然后你用 DayOfWeek == first, DayOfWeek == 0 最后对每个 Group 进行排序。

对于第一个分组,没有标准的 LINQ,因此我们必须使用扩展方法扩展 LINQ。如果您不熟悉扩展方法,请参阅扩展方法揭秘。让我们称这样的组为 Trunk。我们将制作 7 天的树干:

public IEnumerable<IEnumerable<T>> ToTrunks<T>(IEnumerable<T> source, int trunkSize)
{
    // TODO: decide what to do if source null, or trunkSize <= 0

    using (var enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            // some source data available. Create a Trunk:
            int index = 0;
            var trunk = new List<T>(trunkSize);

            // fill the trunk, until trunk full, or no more data
            do
            {
                trunk.Add(enumerator.Current)
            }
            While(trunk.Count < trunkSize && enumerator.MoveNext();

            // return the Trunk:
            yield return trunk;
        }
    }
}

用法:

IEnumerable<int> numbers = Enumerable.Range(10, 20); // = 10..29
var trunks = numbers.ToTrunks(8);

Trunk 0: 10, 11, 12, 13, 14, 15, 16, 17
Trunk 1: 18, 19, 20, 21, 22, 23, 24, 25
Trunk 2: 26, 27, 28, 29

我们会将您的输入数据划分为 7 天的 Trunks,然后对每个 Trunk 的元素进行排序,星期一在前。使用 SelectMany 将结果展平

要获得 DayOfWeek 星期一第一个和星期日最后一个:

(DayOfWeek + 6) % 7.

这将是星期一星期一 (=1) 到 0,星期二 (=2) 到 1,星期日 (=0) 到 6

IEnumerable<DateTime> myOriginalDates = ...
var result = myOriginalDates.ToTrunks(14)        // 14 values per week
    .SelectMany(trunk => trunk.OrderBy(date => (date.DayOfWeek + 6) % 7);
于 2021-03-22T09:10:51.977 回答