2017-06-01 2 views
-2

グループにDateTimesのリストをクラスタ化したいとします。 insのために30秒の間隔でお互いに近くなるたびに。間隔でDatetimesのグループを取得する方法

12:00:05, 
12:00:10, 
12:00:15, 
12:30:15, 
12:30:25 

私は今、私はこの試みた。この

12:00:05, 
12:00:10, 
12:00:15, 
******** 
12:30:15, 
12:30:25 

のようなグループを持つことを期待times- MainBookmarksList

MainBookmarksList.Add(dt1); 
MainBookmarksList.Add(dt2); 
MainBookmarksList.Add(dt3); 
MainBookmarksList.Add(dt4); 
MainBookmarksList.Add(dt5); 

のリストを持っている:

TimeSpan interval = new TimeSpan(0, 0, 15); 

var groupedTimes = from dt in MainBookmarksList 
        group dt by dt.Ticks/interval.Ticks 
        into g 
        select new { Begin = new DateTime(g.Key * interval.Ticks), Values = g.ToList() }; 

をしかし、それは返されません正しい結果。

答えて

1

一つの可能​​な解決策は、これを次のようになります。

static void Main(string[] args) 
    { 
     var MainBookmarksList = new List<DateTime>(); 
     MainBookmarksList.Add(new DateTime(1900, 1, 1, 12, 0, 5)); 
     MainBookmarksList.Add(new DateTime(1900, 1, 1, 12, 0, 10)); 
     MainBookmarksList.Add(new DateTime(1900, 1, 1, 12, 0, 15)); 
     MainBookmarksList.Add(new DateTime(1900, 1, 1, 12, 30, 15)); 
     MainBookmarksList.Add(new DateTime(1900, 1, 1, 12, 30, 25)); 

     var interval = new TimeSpan(0, 0, 15); 

     var groupedTimes = new List<TimeGroup>(); 
     var currentTimeGroup = new TimeGroup(MainBookmarksList[0]); 
     groupedTimes.Add(currentTimeGroup); 
     for (var i = 1; i < MainBookmarksList.Count; i++) 
     { 
      var time = MainBookmarksList[i]; 
      if (time-currentTimeGroup.Begin > interval) 
      { 
       currentTimeGroup = new TimeGroup(time); 
       groupedTimes.Add(currentTimeGroup); 
      } 
      else 
      { 
       currentTimeGroup.Values.Add(time); 
      } 
     } 
    } 

    class TimeGroup 
    { 
     public TimeGroup(DateTime dateTime) 
     { 
      Begin = dateTime; 
      Values = new List<DateTime>() { dateTime }; 
     } 

     public DateTime Begin { get; } 
     public List<DateTime> Values { get; } 
    } 
+0

完璧!ありがとうございました! –

関連する問題