【问题标题】:C# Group by Timestamp produces duplicate keysC# Group by Timestamp 产生重复的键
【发布时间】: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 分组发生在日期时间。输出刚刚格式化以进行故障排除。

标签: c# linq asp.net-core .net-core


【解决方案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,也看不到它们来自哪里。创建一个重现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
相关资源
最近更新 更多