未按预期日期时间顺序输出的行合并列表

本文关键字:输出 合并 列表 顺序 时间 日期 | 更新日期: 2023-09-27 17:50:56

我正在从许多日志文件中读取文本行,并将它们全部添加到名为lstMerged的行列表中。我现在要做的是按照日期和时间的顺序,将这个合并的行列表输出到一个合并的文件中。我的第一次尝试是对合并列表进行排序,如下所示:

    List<Lines> lstMerged = new List<Lines>();
    foreach (var item in logs)
    {
     lstMerged.AddRange(item.lstLines);//Pass lstLines items in all Logs into a single list lstMerged
    }
    lstMerged.Sort((x, y) => DateTime.Compare(x.DateTime, y.DateTime));

这不能正常工作,因为共享相同秒或毫秒的行是随机输出的。例如,如果有10行文本来自两个不同的日志文件,具有完全相同的日期和时间,精确到毫秒,这些行现在是随机排序的,即它们不是按照它们在原始文件中出现的顺序。

我希望所有行按日期和时间排序,但如果有许多行具有相同的日期和时间,那么我希望它们以与原始日志文件相同的顺序出现。有人能看出我的尝试有什么问题吗?

未按预期日期时间顺序输出的行合并列表

您使用的List.Sort()使用的快速排序算法不稳定。

Linq的排序使用一个稳定的排序算法,所以你可以试着用它来代替:

lstMerged = lstMerged.OrderBy(x => x.DateTime).ToList();

Sort使用快速排序算法,该算法不稳定,因此具有相同值的项最终可能与原始项不同。

列表。排序方法(比较)

这个实现执行不稳定排序;如果是2,则为元素是相等的,它们的顺序可能不会被保留。相比之下,稳定排序保留相等元素的顺序。

使用Enumerable.OrderBy,提供稳定的排序。

这个方法执行稳定排序;也就是说,如果两个键元素相等,元素的顺序保持。

lstMerged = lstMerged.OrderBy(x=> x.DateTime).ToList();