gpt4 book ai didi

c# - 具有偏移量的 GroupBy DateTime 列 C# Linq

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:51 25 4
gpt4 key购买 nike

在我的 .NET 4.5.2 C# 控制台应用程序中,我有一个 List<SomeItem>称为 someItemsSomeItem是:

public class SomeItem    {
public int A { get; set; }
public int B { get; set; }
public DateTime C { get; set; }
}

然后我根据 A 将这些项目分组到一个新列表中和 B :

var groupedItems = someItems.GroupBy(x => new { x.A, x.B });

我现在想介绍C进入GroupBy , 但有一个问题:我想组合在一起 SomeItems谁的C属性在 +-(正负)2 秒内(本质上是 2 秒偏移)。因此,例如,两个 SomeItem , 一个有 C设置 2016-03-28 17:58:01.000另一个给2016-03-28 17:58:03.000 , 将被组合在一起。这可能吗?

编辑:出于所有意图和目的,我们假设列表中不会有可能导致“重叠”组的项目(如@J.Steen 在评论中提出的问题)

编辑 2:一个例子

假设以下数据:

  • 15/06/2017 00:00:02
  • 15/06/2017 00:00:04
  • 15/06/2017 00:00:06
  • 15/06/2017 00:00:09
  • 15/06/2017 00:00:11
  • 15/06/2017 00:00:15

..和 2 的偏移量秒,我希望它们按以下方式分组:

第 1 组:

  • 15/06/2017 00:00:02
  • 15/06/2017 00:00:04
  • 15/06/2017 00:00:06

第 2 组:

  • 15/06/2017 00:00:09
  • 15/06/2017 00:00:11

第 3 组:

  • 15/06/2017 00:00:15

最佳答案

您的示例输入和输出有点困惑。

您的前 3 项 2、4 和 6 有重叠。 4 可以属于 2 和 6。这意味着要决定分组,您需要决定分组将基于哪个项目。如果您从 2 开始分组,那么结果将是

  • 第 1 组:2,4
  • 第 2 组:6 人,
  • 第 3 组:9、11
  • 第 4 组:15

看来你已经动用了你的人脑,如果起点是 4 秒,实际上有 6 个可以加入第一组。然后这些组变成:

  • 第 1 组:2,4,6
  • 第 2 组:9、11
  • 第 3 组:15

您可以创建一个 IEqualityComparer<DateTime>要做到这一点,您的分组将取决于集合的顺序:

public class GroupingComparer : IEqualityComparer<DateTime>
{
private readonly int _offset;

public GroupingComparer(int offset)
{
_offset = offset;
}

public bool Equals(DateTime x, DateTime y)
{
if (y.Second >= x.Second - _offset && y.Second <= x.Second + _offset) return true;

return false;
}

public int GetHashCode(DateTime obj)
{
//Should most probably look at a better way to get the hashcode.
return obj.ToShortDateString().GetHashCode();
}
}

像这样使用它:

GroupingComparer comparer = new GroupingComparer(offset:2);
var result2 = dates.GroupBy(x => x, comparer).ToList();

所以现在一切都取决于你想做什么。您可以通过更改集合的顺序来获得上述任一输出。但是,如果您在应用程序的不同部分使用不同的顺序,这可能意味着应用程序中会出现奇怪的行为。也许是一种扩展方法 OrderAndGroup可以解决这个问题。

关于c# - 具有偏移量的 GroupBy DateTime 列 C# Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com