【发布时间】:2019-04-27 03:42:52
【问题描述】:
我在 c# 中有一个列表,其中包含两个日期时间字段:DatePaid 和 DateEntered。我想找到乱序元素。这很容易,老派。按 DatePaid 对列表进行排序,然后对列表执行 foreach,将 DateEntered 捕获到局部变量 (lastDateEntered) 中。每次通过循环,我们首先比较 DateEntered 和 lastDateEntered。如果 DateEntered 小于 lastDateEntered,则前一行将是乱序行。
| DatePaid | DateEntered | comments |
|----------|-------------|--------------|
| 1/1/2019 | 1/1/2019 | |
| 2/1/2019 | 2/2/2019 | |
| 3/1/2019 | 3/1/2019 | |
| 4/1/2019 | 5/2/2019 | out of order |
| 5/1/2019 | 5/1/2019 | |
在 SQL 中(如果您不关心 SQL,请忽略本段),创建两个 CTE's(类似于子查询)很容易:一个按 DatePaid 排序,另一个按 DateEntered 排序。我们使用 Row_Number() 函数添加一个对 CTE 进行排序的额外字段。然后我们加入每个 CTE 的行号,然后只选择从一个 CTE 到另一个 CTE 日期不相等的行。类似于Oracle 12c - sql to find out of order rows,尽管答案没有使用 CTE。我想我可以通过 linq 做类似的事情来混淆我的方式,但我不确定它是否比 foreach 循环方法更容易。
有没有更好的临栖方式?
【问题讨论】:
-
我不明白这个例子。 2019 年 2 月 2 日进场,2019 年 2 月 1 日付款怎么办?无论使用什么日期格式,都是在付款后进入...
-
您是否需要确定哪个项目出现故障?或者只是列表不按顺序排列?
-
为什么要对记录进行排序才能找到乱序的记录?通过对它们进行排序,您可以纠正它们的错误排序。我也不清楚列表中的日期是什么。格式是日-月-年还是月-日-年?
-
@TheodorZoulias 根据乱序评论,它必须是 M/D/Y。
-
顺便说一句,LINQ to Objects 等效于
RowNumber是两个参数Select:list.Select((item,rowNumber) => ...)。