gpt4 book ai didi

Linq 对不同类型的列表进行排序

转载 作者:行者123 更新时间:2023-12-02 00:43:14 27 4
gpt4 key购买 nike

我正在尝试使日志查看器显示来自不同来源但按时间戳排序的事件。我有一种感觉,我可以为此使用 C# Linq,但是如何?

示例:我有一个从文件读取的事件列表到按日期时间戳排序的字符串列表中。

另一个事件来源是数据库插入,我使用 Linq 提取与第一个列表相同的时间段。数据库也有时间戳。

我想要的是列表显示所有实时发生的事件。即数据库插入可能会导致一秒钟后记录在磁盘文件中的异常。

我想我正在寻找一种方法将这些加入并排序到仅共享一个公共(public)字段时间戳的列表,最终得到一个我可以使用 foreach 的集合,即使每个元素可能是不同的类型。

有任何想法吗 ?

马丁

最佳答案

您可以使用 Linq 将两个数据源转换为相同的类型,然后将它们组合并排序。在这里,我有一些来自假装数据库表 T_Log 的对象,它有一个 Timestamp 字段和一些其他字段,另一个来源是来自假文件的一些字符串,其中每个字符串在行的开头都包含一个时间戳。我将它们都转换为自定义类 CommonLog然后用它来排序。 CommonLog 包含对原始对象的引用,因此如果我需要更详细的信息,我可以转换并获取该信息。

更轻量级的实现可以转换为已经存在的类,例如 KeyValuePair<DateTime, object> .

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
// Fake database class.
class T_Log
{
public DateTime Timestamp { get; set; }
public string Info { get; set; }
public int Priority { get; set; }
}

static void Main(string[] args)
{
// Create some events in the fake database.
List<T_Log> dbLogs = new List<T_Log> {
new T_Log { Timestamp = new DateTime(2009, 2, 5), Info = "db: foo", Priority = 1 },
new T_Log { Timestamp = new DateTime(2009, 2, 9), Info = "db: bar", Priority = 2 }
};

// Create some lines in a fake file.
List<string> fileLogs = new List<string> {
"2009-02-06: File foo",
"2009-02-10: File bar"
};


var logFromDb =
dbLogs.Select(x => new CommonLog(
x.Timestamp,
string.Format("{1} [Priority={2}]",
x.Timestamp,
x.Info,
x.Priority),
x));

var logFromFile =
fileLogs.Select(x => new CommonLog(
DateTime.Parse(x.Substring(0, x.IndexOf(':'))),
x.Substring(x.IndexOf(':') + 2),
x
));

var combinedLog = logFromDb.Concat(logFromFile).OrderBy(x => x.Timestamp);
foreach (var logEntry in combinedLog)
Console.WriteLine("{0}: {1}", logEntry.Timestamp, logEntry.Log);
}
}

// This class is used to store logs from any source.
class CommonLog
{
public CommonLog(DateTime timestamp,
string log,
object original)
{
this.Timestamp = timestamp;
this.Log = log;
this.Original = original;
}

public DateTime Timestamp { get; private set; }
public string Log { get; private set; }
public object Original { get; private set; }
}

输出:
05-02-2009 00:00:00: db: foo [Priority=0]
06-02-2009 00:00:00: file: baz
09-02-2009 00:00:00: db: bar [Priority=0]
10-02-2009 00:00:00: file: quux

更新:马丁在对这篇文章的评论中回复了以下内容,但由于评论中缺乏格式,很难阅读。这是格式:
var ld = rs.Select(x => new KeyValuePair<DateTime, object>(DateTime.Parse(x[0]), x))
.Concat(ta.Select(y => new KeyValuePair<DateTime, object>(y.Tidspunkt, y)))
.OrderBy(d => d.Key);

关于Linq 对不同类型的列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1885033/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com