4

我正在尝试创建一个 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()。

在上面的两个循环中,我不知道如何以可读的方式将它们转换为 LINQ。

于 2013-03-23T12:48:25.007 回答