2016-07-06 4 views
2

Я хотел бы, чтобы сгруппировать следующие DateTimes вместе с помощью Linq в C# следующим образом:C# LINQ группы с помощью DateTime до ближайшего второго

Группа 1:

2015-03-03 15:18:42.880 
2015-03-03 15:18:42.897 

Группа 2:

2015-03-19 16:29:59.977 
2015-03-19 16:29:59.983 
2015-03-19 16:29:59.983 

Группа 3:

2015-03-26 11:27:29.813 
2015-03-26 11:27:30.030 
2015-03-26 11:27:30.030 

Группа 4:

2015-03-27 15:13:58.483 
2015-03-27 15:13:58.483 
2015-03-27 15:13:58.500 

У меня возникли проблемы с некоторыми из этих группировок. В настоящее время я просто группирую даты, игнорируя часть миллисекунд. То, что я хотел бы сделать, это групповые даты, которые находятся в пределах 1 секунды друг от друга без миллисекунд. Это мой запрос до сих пор:

var query = 
from trans in TransactionTable.AsEnumerable()               
let dateWithoutMilliseconds = trans.Field<DateTime>("TranactionDate").AddMilliseconds(-trans.Field<DateTime>("TranactionDate").Millisecond) 
group trans by dateWithoutMilliseconds into g 
select new 
{         
TransDate = g.Key,                 
}; 
+3

Это не ясно, что вы имеете в виду под «То, что я хотел бы сделать это дату группы, которые в течение 1 секунды друг от друга без миллисекунд.» Вы имеете в виду группу до ближайшей целой секунды? Поскольку это все равно будет группировать даты, которые находятся в пределах секунды друг от друга в разных группах, например. 2015-03-26 11: 27: 29.513 и 2015-03-26 11: 27: 29.413 - они всего лишь на 100 мс друг от друга, но первый раунд до 2015-03-26 11:27:30, а второй округлить до 2015-03-26 11:27:29. –

+0

Итак, если у вас есть 2015-03-03 15: 18: 42.880, 2015-03-03 15: 18: 43.000 to 2015-03-03 20: 00: 00.000 непрерывных данных всего с разницей в 1 секунду, разделите ли вы это в 1? –

+0

Желаемый результат не ясен; возможно, вы хотели бы создать базу групп по некоторому критерию, который зависит от самих данных, который называется [кластеризация] (https://en.wikipedia.org/wiki/Cluster_analysis). – Codor

ответ

1

Вы можете конвертировать в Ticks (100 наносекунд), округлить, а затем обратно в DateTime. В случае, если вы хотите просто GroupBy просто округлить Tick с:

DateTime source = ... 
... 
// Up to nearest second 
const int shift = 10000000; 

DateTime result = new DateTime(
    (source.Ticks/shift + (source.Ticks % shift >= (shift/2) ? 1 : 0)) * shift); 

// If you want just a key to group by 
long key = (source.Ticks/shift + (source.Ticks % shift >= (shift/2) ? 1 : 0)) * shift; 
Смежные вопросы