给定以下数字(代表星期几):1,2,3,4,5,6,7
.
以下是一些组合示例及其所需的输出:
1,2,3,5,6,7
->1-3,5-7
1,3,5,7
->1,3,5,7
1,2,5,6
->1,2,5,6
1,2,3,6,7
->1-3,6,7
这个想法是连续 3 天或更多天成为一个范围,而单独呈现单个或非后续天(或者从 2 开始设置范围更好)。
我不知道应该从哪里开始编写一个复杂的if
ed 函数,或者这可以使用 LINQ 函数之一来完成?
任何多汁的建议?
我使用数字来简化范围的概念,但在我的代码中,我有一个标记的枚举声明如下:
[Flags]
public enum DaysOfWeek
{
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
我有一个OpeningTimes
带有 field的实体DaysOfWeek
,它告诉该实体的小时范围(在另一个属性中定义)适用于一周中的哪几天。
所以得到上面我使用的(真正得到我Select
使用索引+ 1添加的数字):
var days = Enum.GetValues(typeof(DaysOfWeek))
.Cast<DaysOfWeek>()
.Where(dow => Model.DaysOfWeek.HasFlag(dow));
我认为这个想法是首先删除一个范围内的数字。
我相信我正在寻找一个聚合函数,它也接收前一个值,并且可以返回另一个值类型,所以我可以创建一个函数,如果当前值 -1 等于 prev。值,我等待下一个值,直到范围不连续(或者如果元素代表自身),这就是当我将最后一个批量作为匿名对象返回并开始处理新对象的时候。
然后我会做一个格式化函数,上面写着if (item.First != item.Last) string.Join("-", item.First, Item.Last);