寻找C#算法抓住从datetime对象的集合(保理在这两个日期和时间)经常性项目?(Looking

2019-11-01 15:13发布

我有一个集合DateTime对象。 我需要从这种原始的列表“解析”出子集合抢基于复发的相关项目。 所以,我需要借这个单一的原始集合:

var collectionOfDateTime = GetDateTimeCollection();

并翻译成列表DateTime集合,每个集合包括一组从第一列表中的下一个特定的重复模式的日期。

在我的例子下面,我不包括时间,但在实际需求,这些项目有日期和时间元素,它们。 因此,例如日期必须间隔7天,但也可以在相同时间(一个时间上午11点2月3日下午3点不匹配,2月10日,但上午11时,在不匹配与2月10日)

例如,可以说我的重复模式是“周末画报”(在其他情况下,它可能是“月报”)和我的最新集合看起来是这样的:

 var date1 = DateTime.Today.AddHours(8);
 var date2 = DateTime.Today.AddWeeks(1).AddHours(8);
 var date3 = DateTime.Today.AddDays(3);
 var date4 = DateTime.Today.AddWeeks(8).AddHours(6);

 var collectionOfDateTime = new List<DateTime>() { date1, date2, date3, date4 };

我想一个函数(让我们称之为它StripOutSubCollections()在通过collectionOfDateTime和事实,即它的“周末画报”,并返回一个系列,包括date1date2 (因为它们是相同的每周槽的一部分)。 注DATE3没有不适合和date4也放不下,因为时间不与他人相匹配

另一个例子,以帮助证明这一要求,如果输入到原来的集合是这样的:

 var date1 = DateTime.Today;
 var date2 = DateTime.Today.AddWeeks(1);
 var date3 = DateTime.Today.AddDays(3);
 var date4 = DateTime.Today.AddWeeks(8);
 var date5 = DateTime.Today.AddDays(3).AddWeeks(2);

 var collectionOfDateTime = new List<DateTime>() { date1, date2, date3, date4, date5 };

我希望这个函数返回2名列表(一个列表与date1date2date4 ),并与另一个列表date3date5

让我知道如果我需要更多的例子来阐明的要求? 请注意,有可能是日期的一个可能落入多个输出列出这是罚款。

我可以每周转换成数字7,做好通过每个项目的循环开始第一个项目结束,那么第二项结束,那么第三项等,但想看看是否有一个更优雅的方式

Answer 1:

如果我正确理解你的问题,你想“块”的DateTime在本周日的值?

如果是这样,这样的事情应该这样做:

var byDayOfWeek = collectionOfDateTime.GroupBy(dt => dt.DayOfWeek);
// Optionally convert to a dictionary by day of week
var asDict = byDayOfWeek.ToDictionary(grp => grp.Key, grp => grp.ToList());

foreach(var kvp in asDict)
{
    Console.WriteLine("Day:" + kvp.Key);
    foreach (var value in kvp.Value)
    {
        Console.WriteLine(value);
    }
}

输出:

Day:Thursday
2/21/2013 12:00:00 AM
2/28/2013 12:00:00 AM
4/18/2013 12:00:00 AM
Day:Sunday
2/24/2013 12:00:00 AM

编辑:对于多个“分组依据”规则:

public enum ChunkType
{
    Weekly,
    Monthly,
    Yearly
}

public IEnumerable<IEnumerable<DateTime>> ChunkDates(IEnumerable<DateTime> collection, ChunkType chunkBy)
{
    switch(chunkBy)
    {
        case ChunkType.Weekly:
            // roughly equals by day of week
            return collection.GroupBy(dt => dt.DayOfWeek).Select(grp => grp.ToList());
        case ChunkType.Monthly:
            // Trickier - assume by ordinal day of month?
            return collection.GroupBy(dt => dt.Day).Select(grp => grp.ToList());
        case ChunkType.Yearly:
            // Trickier - assume by ordinal day of year?
            return collection.GroupBy(dt => dt.DayOfYear).Select(grp => grp.ToList());        
    }
    return new[]{ collection };
}

var date1 = DateTime.Today;
var date2 = DateTime.Today.AddDays(7);
var date3 = DateTime.Today.AddDays(3);
var date4 = DateTime.Today.AddDays(8*7);

var collectionOfDateTime = new List<DateTime>() { date1, date2, date3, date4};

foreach(var type in new [] { ChunkType.Weekly, ChunkType.Monthly, ChunkType.Yearly })
{
    Console.WriteLine("Now grouping by:" + type);
    var grouped = ChunkDates(collectionOfDateTime, type);
    foreach(var groupOfDates in grouped)
    {
        Console.WriteLine("New group!");
        foreach (var value in groupOfDates)
        {
            Console.WriteLine(value);
        }
    }
}

输出:

Now grouping by:Weekly
New group!
2/21/2013 12:00:00 AM
2/28/2013 12:00:00 AM
4/18/2013 12:00:00 AM
New group!
2/24/2013 12:00:00 AM

Now grouping by:Monthly
New group!
2/21/2013 12:00:00 AM
New group!
2/28/2013 12:00:00 AM
New group!
2/24/2013 12:00:00 AM
New group!
4/18/2013 12:00:00 AM

Now grouping by:Yearly
New group!
2/21/2013 12:00:00 AM
New group!
2/28/2013 12:00:00 AM
New group!
2/24/2013 12:00:00 AM
New group!
4/18/2013 12:00:00 AM


Answer 2:

var dict = new Dictionary<int, List<DateTime>>();
foreach (var date in collectionOfDateTime) 
{
  if (dict.Contains(date.DayOfWeek))
  {
     dict[date.DayOfWeek].Add(date);
  }
  else 
  {
     dict.Add(date.DayOfWeek, new List<Date> { date });
  }
}


Answer 3:

使用LINQ

尝试(像,这是LINQesque伪代码)

var datecollections = from d in collectionOfDateTime
          group d by d.DayOfWeek into g
          select new { Day = g.Key, Date = g };

给一个去,看看它可以让你...



文章来源: Looking for C# algorithm to grab recurring items from a collection of DateTime objects (factoring in both date and time)?