0

dateRangeからすべての日付値を取得したいのですが、各日時はDayOfWeek.Friday、.. MondaySunday..。

これらの2つのリストは実際の交差ではないと思うので、交差は機能しませんでした...そしてそれらは異なるタイプを持っています:DateTimeとEnum.DayOfWeek

これにより、すべての金曜日のみが表示されますが、OR演算子を使用せずに、月曜日、日曜日も必要です。

var dateRange = _dateService.GetDateRange(startDate, endDate).Where(d => visibleWeekDays.Any(v => d.DayOfWeek == v)).ToList();

これらは両方とも私がどういうわけか比較しなければならないリストです:

IEnumerable<DateTime> dateRange = _dateService.GetDateRange(startDate, endDate);
IEnumerable<DayOfWeek> visibleWeekDays = new List<DayOfWeek>
{
    DayOfWeek.Friday,
    DayOfWeek.Monday,
    DayOfWeek.Sunday,
};

解決策として完全なlingクエリを記述しないでください。なぞなぞを解くために使用しなければならないランダムな順序でlinq拡張メソッドを書くだけです。楽しみと学習のためだけに:)

アップデート

入力日時の値と必要な出力を確認してください。

ここに画像の説明を入力してください

ただし、visibleWeekDaysリストは静的ではないことに注意してください。このコレクションには動的な数の値が含まれる場合があります。したがって、&&または||を使用することはできますが、使用したくありません。オペレーター。

4

4 に答える 4

1

交差点が必要な位置にいるが、2つのコレクションのタイプが同じでない場合は、通常、が必要であることを意味しますJoin。交差は、定義上、2つのコレクションが同じタイプであり、キーセレクターが「それ自体」であり、結果セレクターがアイテムの1つをランダムに選択する結合です(これらは等しくなければならないため、交差点の定義)。これらの制限のすべてがあなたに適用されるわけではないので、あなたがする必要があるのは、より一般的なものにステップアウトすることだけですJoin

これのデモンストレーションとして、これはIntersectちょうどを使用する実装ですJoin

public static IEnumerable<T> Intersect<T>(this IEnumerable<T> first
    , IEnumerable<T> second, IEqualityComparer<T> comparer)
{
    return first.Join(second, x => x, x => x, (a, b) => a, comparer);
}

DayOfWeek自分自身をキーとして選択するだけで、キーセレクターDayOfWeekのオブジェクトをから取得するメソッドが必要になります。結果セレクターでは、オブジェクトDateTimeを取得するだけで済みます。もうオブジェクトDateTimeは必要ありません。DayOfWeek

オッズ内にWhere(x => collection.Any(...またはContainsまたはその他の検索操作があるLINQソリューションを作成しているのを見るときはいつでも、該当する場合は代わりに使用する必要があります(少なくとも、を使用する必要があるかどうかを自問する必要があります)。WhereJoinJoin

完全な実装は必要ないので、以下のスポイラータグに入れます。自分でコードを書きたい場合は、それを見ないでください。

public static IEnumerable FilterDaysOfWeek(IEnumerabledates
    、IEnumerable daysOfWeek)
{{
     戻り日.Join(daysOfWeek
         、date => date.DayOfWeek
         、日=>日
         、(日付、日)=>日付);
 }

于 2013-03-04T20:20:47.413 に答える
0

DayOfWeekを整数に変換する場合は、単純な>と<の比較を行って有効な値を取得できるため、.Whereクエリだけが適切です。

于 2013-03-04T20:15:50.223 に答える
0

の日付と一致するGetDateRangeすべての日付を取得する場合は、次のLinqステートメントを使用できます。DayOfWeekvisibleWeekdays

 _dateService.GetDateRange(startDate, endDate)
             .Where(d=> visibleWeekdays.Contains(d.DayOfWeek));

以下は、これを実際に実行するための完全なテストです。

class Test
    {
        static void Main(string[] args)
        {
            var weekdays = new[] { DayOfWeek.Friday, DayOfWeek.Saturday, DayOfWeek.Sunday };
            var result = GetDateRange(DateTime.Today, DateTime.Today.AddDays(14))
                .Where(d => weekdays.Contains(d.DayOfWeek));
        }

        public static IEnumerable<DateTime> GetDateRange(DateTime start, DateTime end)
        {
            DateTime date = start;

            do
            {
                yield return date;
                date = date.AddDays(1);
            }
            while (date < end);
        }
    }
于 2013-03-04T20:17:40.920 に答える
0

あなたはあなたの節Containsでで使うことができます。visibleWeekDaysWhere

于 2013-03-04T20:18:09.317 に答える