c# - 在 LINQ 中查找相似的记录

标签 c# linq grouping

我有以下 LINQ 查询,它将用于查找任何“相似”的 cargo :

from c in cons
group c by new { c.TripDate.Value, c.DeliveryPostcode, c.DeliveryName } into cg
let min = cg.Min(a => a.DeliverFrom)
let max = cg.Max(a => a.DeliverFrom)
let span = max - min
where span.TotalMinutes <= 59
select cg;

主要是最小值、最大值和跨度。基本上,“组”中的任何 cargo ,其 DeliverFrom 日期时间在组中任何其他 cargo 的 59 分钟内,都将在组中退回。

上面的代码最初对我来说看起来不错,但经过​​进一步检查,似乎如果组中有超过 2 条记录 - 2 条 DeliverFrom 日期彼此相差 59 分钟,而 1 条 DeliverFrom 日期不是 在任何 59 分钟内,则查询不会返回该组,因为它将选择最小值和最大值并看到差异超过 59 分钟。我想要发生的是看到组中有 2 批 cargo 的 DeliverFrom 日期足够接近,然后只选择一个包含这两批 cargo 的组。

我该怎么做呢?

编辑:Doh,其中添加了另一个子句。有一个叫做'Weight'的字段和一个叫做'Spaces'的字段,每个组最多可以有26个权重和26个空格

最佳答案

如果我没记错的话,你要找的是一个名为 cluster identification 的统计问题。 ,如果是这样的话,它是一个比你想象的要复杂得多的问题。

作为思维练习,假设您在 1:00、1:30 和 2:00 有 3 个条目。你想如何对这些进行分组?前两个或后两个可以作为一个小组工作(相隔不到 59 分钟),但所有 3 个都不会。

如果您只想继续将项目链接到一个组中,只要它们与组中任何其他项目的距离不超过 59 分钟,您就需要继续迭代,直到您停止寻找要添加到任何集群的新项目。

关于c# - 在 LINQ 中查找相似的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8852681/

相关文章:

c# - 如何在序列中的linq中获取元素范围?

c# - ProgressBar 重置为 60%

c# - 使用 LINQ 和 vars 时如何避免方法长度蠕变

c# - 为什么 LINQ FirstOrDefault 或 First 生成的调用次数

postgresql - 将时间差较小的交错记录分组

c# - 使用 ReferenceLoopHandling.Ignore 序列化循环依赖的 ISerializable 对象时抛出 StackOverflowException

c# - 转换一个实现接口(interface)中所有方法的类

.net - DataTables 和 LINQ 中的装箱/拆箱

php - 按列值的前导字符对数据行进行分组

python - 按不同值分组