0

我有一个DateTime对象集合。我需要从这个原始列表中“解析”出子集合,以根据重复获取相关项目。所以我需要采取这个单一的原始集合:

var collectionOfDateTime = GetDateTimeCollection();

并将其转换为DateTime集合列表,其中每个集合都包含来自第一个列表的一组日期,这些日期遵循特定的重复模式。

在下面的示例中,我不包括时间,但在实际要求中,这些项目同时具有日期和时间元素。因此,例如,日期需要相隔 7 天,但也要相同(2 月 3 日上午 11 点的时间与 2 月 10 日下午 3 点不匹配,但与 2 月 10 日上午 11 点匹配)

例如,假设我的重复模式是“每周”(在其他情况下可能是“每月”),我的日期集合如下所示:

 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它的“每周”这一事实并返回一个包含date1,的集合date2(因为它们都是同一个每周时段的一部分)。注意 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 个列表(一个带有date1,date2date4的列表)和另一个带有date3and的列表date5

让我知道是否需要更多示例来阐明要求?请注意,其中一个日期可能会落入多个输出列表中,这很好。

我可以将每周转换为数字 7 并循环遍历每个项目,从第一个项目开始到最后,然后第二个项目到最后,然后是第三个项目,等等,但想看看是否有更优雅的方式

4

3 回答 3

2

如果我正确理解您的问题,您是否正试图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
于 2013-02-21T18:33:44.680 回答
0

使用 LINQ

尝试(类似于,这是 LINQesque 伪代码)

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

试一试,看看它会把你带到哪里......

于 2013-02-21T18:34:48.613 回答
0
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 });
  }
}
于 2013-02-21T18:36:16.447 回答