如何合并连续几天的平等开放时间?

时间:2018-02-13 13:19:29

标签: c#

我想在连续几天合并相同的开放时间。

public class AgendaDay {
    public string Day;
    public string AM;
    public string PM;

    public AgendaDay(string day, string aM, string pM)
    {
        Day = day;
        AM = aM;
        PM = pM;
    }
}

var agenda = new List<AgendaDay>() {
    new AgendaDay("Mon", "0900-1200", "1400-1700"),
    new AgendaDay("Tue", "0900-1200", "1400-1700"),
    new AgendaDay("Wed", "", "1400-1700"),
    new AgendaDay("Thu", "0900-1200", "1400-1700"),
    new AgendaDay("Fri", "0900-1200", "1400-1700"),
    new AgendaDay("Sat", "0900-1200", ""),
    null
};

将其缩减为:

var expected = @"Mon-Tue: 09H00-12H00 / 14H00-17H00 
Wed: 14H00-17H00
Thu-Fri: 09H00-12H00 / 14H00-17H00  
Sat: 09H00-12H00";

现在我有:

public class ShortAgendaDay
{
    public List<string> Days;
    public string AM;
    public string PM;
    public ShortAgendaDay(List<string> days, string aM, string pM)
    {
        Days = days;
        AM = aM;
        PM = pM;
    }
}

private static string ShrinkOpenningHour( List<AgendaDay> agenda)
{
    var temp = agenda.Where(x=> x!=null).ToArray();        
    List<ShortAgendaDay> sum = new List<ShortAgendaDay>();

    for (var i = 0; i < temp.Count(); i++)
    {
        if (i == 0) continue;

        var last = temp[i - 1];
        var curr = temp[i];
        if (last.AM == curr.AM && last.PM == curr.PM) {

        }
    }

    throw new NotImplementedException();
}

我的想法是将其缩小为以下列表:

{ 
    day:["Mon","Tue"],
    hour: "09H00-12H00 / 14H00-17H00"
},
{ 
    day:["Wed"],
    hour:"14H00-17H00"
},
{ 
    day:["Thu","Fri"],
    hour:"09H00-12H00 / 14H00-17H00"
}

然后从日期列表中仅取出第一个和最后一个。

从“0900-1200”到“09h00-12h00”的格式不是您可以在答案中忽略的问题。
“0900-1400”,“1400-1700”仅等于“0900-1400”,“1400-1700”。没有像“0900-1000”,“1000-1700”这样的技巧。重叠的时间戳并不重要。它是一个字符串,必须作为字符串处理,而不是带有重叠时间跨度的时间戳。

1 个答案:

答案 0 :(得分:0)

这是合并:

private string ShrinkOpenningHour(List<AgendaDay> agenda)
{
    var temp = agenda.Where(x => x != null).ToArray();
    List<ShortAgendaDay> sum = new List<ShortAgendaDay>();

    for (var i = 0; i < temp.Count(); i++)
    {
        if (i == 0 || (temp[i - 1].heureAM == temp[i].heureAM && temp[i - 1].heurePM == temp[i].heurePM))
        {
            var existingEntry = sum.Where(x => x.AM == temp[i].heureAM && x.PM == temp[i].heurePM);
            if (existingEntry.Count() == 1)
            {
                existingEntry.First().Days.Add(temp[i].jour);
            }
            else
            {
                sum.Add(new ShortAgendaDay(new List<string>() { temp[i].jour }, temp[i].heureAM, temp[i].heurePM));
            }
        }
    }

    return string.Join(Environment.NewLine, sum.Select(x => FormatHorraire(x)));
}

作为奖励形成:

private string FormatHorraire(ShortAgendaDay x)
{
    string days = string.Join(" - ", new String[] { x.Days.First(), x.Days.Last() }.Where(ar => ar != null).Distinct());
    string hour = FormatHorraire(x.AM, x.PM);
    return days + " : " + hour;
}

private string FormatHorraire(string am, string pm)
{
    return string.Join(" / ", new string[] { am, pm }.Where(y => !string.IsNullOrWhiteSpace(y) && y.Length > 7).Select(y => y.Insert(2, "H").Insert(8, "H")));
}