1

60個のDateTimeオブジェクト(昇順で並べ替え)を含むリストがあり、各日付がリスト内の前の日付より1か月大きいことを検証する必要があります。

たとえば、次の日付のリストは、欠落していない状態で1か月ずつ増加するため、有効です。

2009年1月2009年
2月2009年
3月2009年
4月

ただし、2009年2月が欠落しているため、次の日付のリストは無効になります。

2009年1月2009年
3月2009年
4月

日は関係なく、だけが考慮されます。

これを行うための効率的できれいな方法はありますか?

4

4 に答える 4

8

すべての日付について、(年* 12 +月)を取ると、整数の順次リストが表示されます。ギャップをチェックする方が簡単かもしれません。

于 2009-08-06T19:55:32.923 に答える
3

次のことを試すことができます。

int start = list.First().Year * 12 + list.First().Month;
bool sequential = list
    .Select((date, index) => date.Year * 12 + date.Month - index)
    .All(val => val == start);

これにより、日付のリストが年と月を表す数値に「変換」されます。この数値は、リスト内の項目ごとに1ずつ増加する必要があります。次に、これらの各アイテムから現在のインデックスを差し引くため、有効なリストの場合、すべてのアイテムの値は同じになります。start次に、すべての値を、最初に計算された値であると比較します。

于 2009-08-06T19:59:40.257 に答える
1

ユースケースと正しく比較できる慎重に作成されたセレクターを使用した、クリーンなチェックを次に示します。

IEnumerable<DateTime> dates = ...;
DateTime firstDate = dates.First();
IEnumerable desired = Enumerable.Range(0, 60).Select(months => firstDate.AddMonths(months));
bool correct = dates.SequenceEqual(desired, date => date.Year*12 + date.Month);

このカスタムの使用SequenceEqual

public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T1> second, Func<T1, T2> selector)
{
    // uses the LINQ Enumerable.SequenceEqual method on the selections
    return first.Select(selector).SequenceEqual(second.Select(selector));
}

// this is also useful, but not used in this example
public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T1> second, Func<T1, T2> selector, IEqualityComparer<T2> comparer)
{
    return first.Select(selector).SequenceEqual(second.Select(selector), comparer);
}
于 2009-08-06T20:11:52.477 に答える
0
public bool MonthsAreSequential(IList<DateTime> dates)
{
    if (dates.Count < 2) return true;

    for (int i = 0; i < dates.Count - 1; i++)
    {
        var plusOne = dates[i].AddMonth(1);
        var nextMonth = dates[i + 1];
        if (plusOne .Year != nextMonth .Year 
            || plusOne .Month != nextMonth .Month)
            return false;
    }
    return true;
}
于 2009-08-06T19:58:11.247 に答える