0
class order {
    Guid employeeId;
    DateTime time;
}

時間範囲に基づいて、注文のリストを 4 つのリストにフィルター処理する必要があります。午前 0 時から 9 時までは 1 番目のリスト、午前 9 時から午後 2 時までは 2 番目、午後 2 時から 6 時までは 3 番目まで、午後 6 時から 12 時までは 4 番目のリストまで。

効率的な方法でラムダ式を使用してこれを達成できるかどうか興味がありますか? そうでなければ、リストを分割する最良の方法は何でしょうか?

4

5 に答える 5

3

これはうまくいくはずです:

var orders = list.OrderBy(o => o.time);
var first  = orders.TakeWhile(o => o.time.TimeOfDay.TotalHours <= 9);
var second = orders.SkipWhile(o => o.time.TimeOfDay.TotalHours <= 9)
                   .TakeWhile(o => o.time.TimeOfDay.TotalHours <= 14);
var third  = orders.SkipWhile(o => o.time.TimeOfDay.TotalHours <= 14)
                   .TakeWhile(o => o.time.TimeOfDay.TotalHours <= 18);
var fourth = orders.SkipWhile(o => o.time.TimeOfDay.TotalHours <= 18);

を使用する別の、おそらくより効率的で、より柔軟で簡潔なアプローチを次に示しますEnumerable.GroupBy

var groups = list.Select(o => new
{
    Order = o,
    DayPart = o.time.TimeOfDay.TotalHours <= 9 ? 1
       : o.time.TimeOfDay.TotalHours > 9  && o.time.TimeOfDay.TotalHours <= 14 ? 2
       : o.time.TimeOfDay.TotalHours > 14 && o.time.TimeOfDay.TotalHours <= 18 ? 3 : 4
})
.GroupBy(x => x.DayPart)
.OrderBy(g => g.Key);

var first = groups.ElementAt(0);  
var second = groups.ElementAt(1);
// ...
于 2012-11-10T23:41:15.637 に答える