C#从列表中获取每6个月的组合

时间:2015-03-18 14:14:24

标签: c# list

我只在接下来的几个月内开始销售,并且喜欢每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}

3 个答案:

答案 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;
}