在我的 .NET 4.5.2 C# 控制台应用程序中,我有一个 List<SomeItem>
叫someItems
与 SomeItem
是:
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:示例
假设以下数据:
- 2017年6月15日00:00:02
- 2017年6月15日00:00:04
- 2017年6月15日00:00:06
- 2017年6月15日00:00:09
- 2017年6月15日00:00:11
- 2017年6月15日00:00:15
..偏移量为 2
秒,我希望它们按以下方式分组:
第 1 组:
- 2017年6月15日00:00:02
- 2017年6月15日00:00:04
- 2017年6月15日00:00:06
第 2 组:
- 2017年6月15日00:00:09
- 2017年6月15日00:00:11
第 3 组:
- 2017年6月15日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/