次の数値 (曜日を表す) が与えられた場合: 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 日以上が範囲になり、1 日またはそれ以降の日は別々にレンダリングされるということです (または、2 から始まる範囲を作成する方が適切です)。
複雑な ed 関数をどこから始めればよいのかわかりませんか、if
それとも LINQ 関数の 1 つを使用してこれを行うことができますか?
ジューシーな提案はありますか?
範囲の概念を単純化するために数値を使用しましたが、私のコードでは、次のように宣言されたフラグ付き列挙型があります。
[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が前の値に等しい場合に関数を作成できます。範囲が連続しなくなるまで(または要素がそれ自体を表す場合)、次の値を待ちます。これは、最後の一括を匿名オブジェクトとして返し、新しい一括で作業を開始するときです。
次に、次のような書式設定関数を作成しますif (item.First != item.Last) string.Join("-", item.First, Item.Last);