mos*_*o87 7 c# linq algorithm asp.net-mvc
我有以下型号:
public class Entry
{
public int UseraccountId { get; set; }
public int CompanyId { get; set; }
public DateTime CreationDate { get; set; }
public string Target { get; set; }
public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及包含大量条目的列表:
List<Entry> entries = ... //get all entries.
Run Code Online (Sandbox Code Playgroud)
例:

我现在想要对第2行和第3行进行分组,因为它们具有相同的UserId,相同的CompanyId,相同的目标和几乎(这是困难的部分),假设在5秒的范围内,相同的日期时间.
分组后,我的列表应如下所示:

这个问题有什么简单的方法吗?有什么建议吗?我打赌Linq会帮助我,但我不确定如何.
编辑: 谢谢大家的反馈.我决定改变设计并确保日期时间现在真的相同.因此,使用linq进行分组现在非常容易.
没有直接的答案,因为这取决于您认为匹配的内容。有简单的方法,也有复杂的方法,也有介于两者之间的方法。您需要为此提出算法。一个简单的方法是缩短秒数并精确到分钟,但这可能太长了。您可以编写一个方法,将时间戳标准化为 5 或 10 秒,并按照建议进行分组。
如果您想将 x 秒内的任意两条消息分组在一起,那么这种方法大部分情况下都有效。总会有一些值在范围内但落在截止值的两侧。如果您对此感到满意并且重视简单性,那么上面的答案将会起作用。
如果这不起作用并且您想要跨人工截止进行分组,那么您将需要另一种方法。在这种情况下,一个简单的方法可能是使用 LINQ 按除时间戳之外的所有内容进行分组。这将对您的数据进行初步分组。然后,您可以迭代每个组,并将每个时间值与同一组中的每个其他时间值进行比较,并确定它是否在您的范围内。然后手动抓取那些落在指定范围内的值并将它们分组在一起。
这有一个额外的边缘情况,您需要做出决定。如果您决定在 1 秒内分组,并且您有三个条目,其秒数(简化)为 1、2 和 3。1 和 2 在一秒内,2 和 3 也在一秒内,但 1 和 3 不在t。你会根据 2 与其他 2 的距离在一秒之内对它们进行分组,还是将 1 和 2 分组,使 2 不符合与 3 和 3 分组的条件,这将是单独的。
您最终将得到一个解决方案,该解决方案的存储桶可以基于将值链接在一起而增长,或者基于创建的第一组而不是困难时间截止的不同人工截止。困难时期要简单得多,因此除非您的存储桶不断增长,否则我建议仅使用标准化时间戳并对其进行分组。
您需要定义“几乎”的含义并进行相应的计划。