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 产生重复的键的主要内容,如果未能解决你的问题,请参考以下文章