【发布时间】:2019-01-20 21:17:22
【问题描述】:
我有多个长度相同的集合,一个List<DateTime> 类型的时间戳集合和几个List<double> 类型的数据集合。 List<double 中每个索引位置的值对应于List<DateTime> 中的相应索引位置。
我希望能够通过TimeSpan 压缩所有数据集合中的数据,该TimeSpan 应用于List<DateTime>,并将时间戳分组到TimeSpan 箱中,并对每个数据集合应用相同的分组。
这是我目前“压缩”时间戳的时间序列的方式:
var someTimeStamps = new List<DateTime>();
var compression = TimeSpan.FromHours(1).Ticks;
var compressedTimeStamps = from rawData in someTimeStamps
group rawData by rawData.Ticks / numberTicks
into tickData
select new DateTime(tickData.Key * compression);
如何调整代码以使相同的分组也适用于数据集合List<double>?我想应用一个对每个数据组中的值进行平均的分组逻辑。我的目标是计算效率,内存消耗不是我希望在这一点上优化的问题。
例如:
List<DateTime> items:(为简单起见,以下值的顺序为(年、月、日、小时、分钟、秒):
(1) 2018, 8, 14, 08, 20, 05 (2) 2018 年 8 月 14 日 08 年 45 月 25 日 (3) 2018 年 8 月 14 日 09 年 02 月 53 日 (4) 2018, 8, 14, 09, 34, 12 (5) 2018, 8, 14, 09, 44, 12
List<value>项目:
(1) 12 (2) 15 (3) 27 (4) 03 (5) 12
应用TimeSpan.FromHours(1) 的压缩,两个集合的期望结果是:
List<DateTime>项目:
(1) 2018, 8, 14, 08, 00, 00 (2) 2018 8 14 09 00 00
List<double> items(平均应用于每个组中的项目)
(1) 13.5(12 和 15 的平均值) (2) 14(平均 27、3 和 12)
【问题讨论】:
-
Zip允许您将两个可枚举项投影到一个(新)可枚举项中。因此,您创建了一个具有两个属性的新匿名类型——一个是DateTime,一个是double。然后从那里做任何你需要做的事情。 -
@mjwills,这是有道理的,感谢您的详细说明,但是,如果我想将分组应用于多个数据系列,是否可以在一次通话中做到这一点,或者我是否必须运行投影并多次分组?
-
github.com/morelinq/MoreLINQ/blob/master/MoreLinq/EquiZip.cs 如果你想
Zip超过两个系列,可以使用。 -
谢谢@mjwills,我去看看。是的,尽管问题仅使用一个数据列表,但我的意图是将其应用于具有一个匹配长度时间戳集合的多个数据列表。出于简化目的,我在问题中使用了一个数据集合,因为大多数解决方案最有可能在此特定方面进行扩展
标签: c# collections group-by enumerable