4

範囲が重複する可能性があることを考慮して、Capacity 値の合計を含む日付範囲のコレクションを生成する linq クエリを作成しようとしています。その重複期間の合計と個別の日付範囲が必要です。ありがとう。

public ActionResult Index()
        {
            List<Capacities> _list = new List<Capacities>{
               new Capacities {StartDate = DateTime.Parse("01/01/2013"), StopDate = DateTime.Parse("01/01/2013 06:00"), Capacity = 100},
               new Capacities {StartDate = DateTime.Parse("01/01/2013 04:00"), StopDate = DateTime.Parse("01/02/2013 00:00"), Capacity = 120},
               new Capacities {StartDate = DateTime.Parse("01/04/2013"), StopDate = DateTime.Parse("01/04/2013 15:00"), Capacity = 100},
               new Capacities {StartDate = DateTime.Parse("01/04/2013 15:00"), StopDate = DateTime.Parse("01/04/2013 18:00"), Capacity = 150}
            };
            //results expected
            //01/01/2013 00:00 - 01/01/2013 04:00   100
            //01/01/2013 04:00 - 01/01/2013 06:00   220
            //01/01/2013 06:00 - 01/02/2013 00:00   120
            //01/04/2013 00:00 - 01/04/2013 15:00   100
            //01/04/2013 15:00 - 01/04/2013 18:00   150
            return View();
        }

        public class Capacities
        {
            public DateTime StartDate { get; set; }
            public DateTime StopDate { get; set; }
            public int  Capacity {get;set;}
        }
4

1 に答える 1

3

私はいくつかのプログラミングを行いましたが、コードをかなり拡張しました。しかし、私は最後にLINQを使用することができました:-)

私のコード:

SortedSet<DateTime> splitdates = new SortedSet<DateTime>();
foreach (var item in _list)
{
    splitdates.Add(item.Period.Start);
    splitdates.Add(item.Period.End);
}

var list = splitdates.ToList();
var ranges = new List<DateRange>();
for (int i = 0; i < list.Count - 1; i++)
    ranges.Add(new DateRange() { Start = list[i], End = list[i + 1] });

var result = from range in ranges
             from c in _list
             where c.Period.Intersect(range) != null
             group c by range into r
             select new Capacities(r.Key.Start, r.Key.End, r.Sum(a => a.Capacity));

完全なコードはこちら: http://pastebin.com/wazbb1r3 ロケールによって出力が異なることに注意してください。また、DateRange.Contains() のように不要なビットもあります。

上記の 2 つのループでは、読みやすい方法でそれらを LINQ に変換する方法がわかりません。

于 2013-03-23T12:48:25.007 に答える