C# Group by Timestamp 产生重复的键

Posted

技术标签:

【中文标题】C# Group by Timestamp 产生重复的键【英文标题】:C# Group by Timestamp produces duplicate keys 【发布时间】:2021-12-17 16:16:21 【问题描述】:

我正在尝试对一组时间戳 (DateTime) 进行分组,我可以看到 groupby 在我们的生产环境中产生重复的键。

foreach (var price in prices.GroupBy(x => x.Timestamp))

    logger.LogInformation($"price.Key.ToString("yyyy-MM-dd HH:mm:ss.fff")");



2021-10-01 20:54:49.661
2021-10-01 21:00:00.356
2021-10-03 21:05:03.816
2021-10-03 21:05:15.876
2021-10-03 21:05:29.140
2021-10-03 21:05:51.356
2021-10-03 21:06:04.996
2021-10-03 21:06:15.308
2021-10-03 21:06:44.648
2021-10-03 21:06:58.521
2021-10-01 20:54:49.661
2021-10-01 21:00:00.356
2021-10-03 21:05:03.816
2021-10-03 21:05:15.876
2021-10-03 21:05:29.140
2021-10-03 21:05:51.356
2021-10-03 21:06:04.996
2021-10-03 21:06:15.308
2021-10-03 21:06:44.648
2021-10-03 21:06:58.521

在我的本地机器上,完全相同的代码会生成以下正确的代码

2021-10-01 20:54:49.661
2021-10-01 21:00:00.356
2021-10-03 21:05:03.816
2021-10-03 21:05:15.876
2021-10-03 21:05:29.140
2021-10-03 21:05:51.356
2021-10-03 21:06:04.996
2021-10-03 21:06:15.308
2021-10-03 21:06:44.648
2021-10-03 21:06:58.521

有人知道为什么会这样吗?

【问题讨论】:

您的精度似乎有问题。这些键没有重复,但是当您格式化它们时,您只使用使它们重复的 2 精度刻度。如果你想要这个输出,你应该在分组时使用相同的格式。 @Eldar 分组发生在日期时间。输出刚刚格式化以进行故障排除。 【参考方案1】:

如果您的意思是您的第一个输出在中途重复,那么这些键中的 something 是不同的。您无法通过ToString() 格式字符串查看所有详细信息。

复制:

var now = DateTime.Now;

var dateTimes = new []

    new DateTime(now.Ticks),
    new DateTime(now.Ticks),
    new DateTime(now.Ticks + 1),
    new DateTime(now.Ticks + 2),
    new DateTime(now.Ticks + 3),
;

var groupedDateTimes = dateTimes.GroupBy(x => x);

foreach (var grouped in groupedDateTimes)

    Console.WriteLine($"grouped.Key.ToString("yyyy-MM-dd HH:mm:ss.ffffff") (count: grouped.Count())");

给予:

2021-11-03 09:22:57.585592 (count: 2)
2021-11-03 09:22:57.585592 (count: 1)
2021-11-03 09:22:57.585592 (count: 1)
2021-11-03 09:22:57.585592 (count: 1)

看起来相同,但它们的刻度不同。如果您声称 DateTimes 具有相同的刻度,那么您的生产代码可能只是调用该方法两次或以其他方式复制数据。 GroupBy() 没有损坏,假设您的代码是。

【讨论】:

DateTime.Kind 不会导致这种情况 - 它不用于相等性检查。我怀疑这是亚毫秒级的差异。 是的,这就是我的怀疑。我尝试按 Timestamp.Ticks 分组,但结果仍然相同。 @Jon 感谢您的更正,请记住。 如何克服亚毫秒问题? @pantonis 然后读取How to Ask 并提供带有几个硬编码DateTime 值的minimal reproducible example,这些值仍然会以您观察到的方式触发GroupBy()。变化在于这样做你会发现不同。我们看不到您的prices,也看不到它们来自哪里。创建一个重现。

以上是关于C# Group by Timestamp 产生重复的键的主要内容,如果未能解决你的问题,请参考以下文章

关于C#中group by如何实现多条件分组汇总

C# Linq group by 和 group by into 运用实例

无需手动键入所有列即可从 group by 中获取一条记录

MySQL - Group By 有去重功能吗?

group by 分组去重查询

Oracle 用group by 去重计数还是用distinct 计数