我只在接下来的几个月内开始销售,并且喜欢每6个月创建一次报告,我想知道如何每6个月获得一次组合。
List<MyDate> list = new List<MyDate>();
list.Add(new MyDate(){ Year=2014, Month=4});
list.Add(new MyDate(){ Year=2014, Month=6});
list.Add(new MyDate(){ Year=2014, Month=8});
list.Add(new MyDate(){ Year=2015, Month=1});
list.Add(new MyDate(){ Year=2015, Month=3});
list.Add(new MyDate(){ Year=2016, Month=1});
List<List<MyDate>> output = Get6MonthsCombinations(); // This is method I like to create
我喜欢输出看起来像下面的
// output[0] -> {Year=2014,Month=4},{Year=2014,Month=6},{Year=2014, Month=8}
// output[1] -> {Year=2014,Month=8},{Year=2015,Month=1}
// output[2] -> {Year=2015,Month=1},{Year=2015,Month=3}
// output[3] -> {Year=2016,Month=1}
答案 0 :(得分:1)
如果您将183天视为半年,这应该有效:
List<List<MyDate>> Get6MonthsCombinations(List<MyDate> input)
{
List<List<MyDate>> output = new List<List<MyDate>>();
var ordered = input.OrderBy(x => x.Year).ThenBy(x => x.Month).ToList();
if(ordered.Count == 0)
return output;
DateTime periodStart = new DateTime(ordered[0].Year,ordered[0].Month, 1);
output.Add(new List<MyDate>());
foreach (MyDate md in ordered)
{
DateTime month = new DateTime(md.Year, md.Month,1 );
if ((month - periodStart).Days > 183)
{
output.Add(new List<MyDate>());
periodStart = month;
}
output.Last().Add(md);
}
return output;
}
答案 1 :(得分:0)
我首先尝试解释,你的意思(我认为)。
您想在月份列表中滑动6个月的窗口,并获得适合6个月范围的任意月份组合吗?正确?
然后您的输出应以{Year = 2014,Month = 4}开头,或者不应以{Year = 2016,Month = 1}结束。
要实现此目的,请使用两个索引(开始和结束)。两者都在开始时设置为0。增加第二个(窗口结束)并检查月份[开始]到月份[结束]是否超过6个月。如果是,则增加开始,开始新结果。
答案 2 :(得分:0)
假设订单已订购:
var output = new List<List<MyDate>>();
int first = 0;
while (first < list.Count) {
var values = new List<MyDate>();
values.Add(list[first]);
int next = first+1;
for ( ; next < list.Count; ++next) {
if (list[next].Year * 12 + list[next].Month
- (list[first].Year * 12 + list[first].Month) < 6) {
values.Add(list[next]);
} else {
break;
}
}
output.Add(values);
first = next;
}