我正在尝试使用Linq中的DayOfWeek
枚举使用Linq,使用以下代码段对<... 1}}枚举进行排序 -
DayOfWeek currentDayOfWeek = DateTime.UtcNow.DayOfWeek;
SortedDictionary<DayOfWeek, TimeSpan> backupSchedule =
new SortedDictionary<DayOfWeek, TimeSpan>();
Dictionary<DayOfWeek, TimeSpan> sortedScheduleBasedOnCurrentDayOfWeek
= new Dictionary<DayOfWeek, TimeSpan>();
sortedScheduleBasedOnCurrentDayOfWeek = backupSchedule.OrderBy(
backupdayandtime => (((int)backupdayandtime.Key + (int)currentDayOfWeek) % 7))
.ToDictionary(t => t.Key, t => t.Value);
如果当前DayOfWeek
为Wednesday
,
以及backupSchedule中的天数列表
Friday
Thursday
Wednesday
我希望上面的结果是
Wednesday
Thursday
Friday
然而,上面的代码导致
Thursday
Friday
Wednesday
我在这里遗漏了什么吗?
答案 0 :(得分:1)
首先,我使用的那种是
backupSchedule
// This lambda evaluates to `true` for e.g. Sunday through Tuesday;
// `true > false` therefore these days will appear last
.OrderBy(kvp => kvp.Key < currentDayOfWeek)
// This then sorts each half in the normal order - not really
// necessary if the original source is already in the normal order
.ThenBy(kvp => kvp.Key)
其次,你不能真正将一个序列存储在字典中,并希望字典能够记住你把它放入的顺序。在这种情况下,似乎可以工作,但是没有保证它会。
您无法将结果存储在字典中 - 只需将键按顺序存储在数组中(或直接在foreach
中使用),然后使用原始字典查找值。
答案 1 :(得分:0)
((int)backupdayandtime.Key + (int)currentDayOfWeek) % 7)
那应该是 - 而不是+。
说当前的星期三是星期三是3.星期二然后是2,2-3 = -1,-1 mod 7是6.星期三将是(3-3)mod 7,它是0.星期四将是( 4-3)mod 7为1。
加上你得到星期二= 5,星期三= 6,星期四= 0等,这说明了你最终的订单。
答案 2 :(得分:0)
请尝试运行此LINQ命令。
sortedScheduleBasedOnCurrentDayOfWeek = backupSchedule.OrderBy(backupdayandtime => (((int)backupdayandtime.Key >= (int)currentDayOfWeek)? ((int)backupdayandtime.Key - (int)currentDayOfWeek) : (((int)backupdayandtime.Key + 7) - (int)currentDayOfWeek))).ToDictionary(t => t.Key, t => t.Value);