給定以下數字(表示星期幾):1,2,3,4,5,6,7
。用LINQ挑戰管理範圍
下面是一些組合的實施例和它們的期望輸出:
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
與現場DaysOfWeek
,告訴什麼天一週此實體的小時範圍(在另一個屬性中定義)適用於。
所以得到我用上面的(真正得到的數字我會使用索引+ 1加Select
):
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);
你也可以使用鋸齒陣列 – Shimmy
鋸齒陣列是不好的linq。所以我更喜歡List。 :) –
稍後我會調整你的代碼,但我認爲這是我要使用的。 – Shimmy