0

オブジェクトのコレクションがありDateTimeます。この元のリストからサブコレクションを「解析」して、繰り返しに基づいて関連アイテムを取得する必要があります。だから私はこの単一のオリジナルコレクションを取る必要があります:

var collectionOfDateTime = GetDateTimeCollection();

そして、それをコレクションのリストに変換しDateTimeます。各コレクションには、特定の再発パターンに従った最初のリストの日付のセットが含まれています。

以下の例では、時間を含めていませんが、実際の要件では、これらのアイテムには日付と時刻の両方の要素が含まれています。したがって、たとえば、日付は7日間隔である必要がありますが、同じ時刻である必要があります(2月3日の午前11時の1回は、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()を渡して、を含む1つのコレクションを返すようにします(これらはすべて同じウィークリースロットの一部であるため)。時間が他と一致しないため、date3は適合せず、date4も適合しないことに注意してくださいcollectionOfDateTimedate1date2

要件を証明するのに役立つ別の例として、元のコレクションへの入力が次の場合:

 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つのリスト(1つは、、、および)を返し、もうdate11つはとを含むリストを返すようにします。date2date4date3date5

要件を明確にするためにさらに例が必要かどうか教えてください。日付の1つが複数の出力リストに分類される可能性があることに注意してください。これは問題ありません。

毎週数字の7に変換して、最初のアイテムから最後まで、次に2番目のアイテムから最後まで、次に3番目のアイテムというように各アイテムをループすることができますが、もっとエレガントな方法があるかどうかを確認したかったのです。

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
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 に答える
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 に答える