在非ienumerable类型上使用lambda表达式过滤Windows日志

本文关键字:表达式 过滤 Windows 日志 lambda ienumerable 类型 在非 | 更新日期: 2023-09-27 18:12:04

我试图根据一些标准获取和过滤Windows日志,其中一个是Message过滤。Message的性质在EventLog.GetEventLogs().Entries.Message中。问题是EntriesEventLogEntryCollection,我不能在上面运行lambda表达式(其中)。我还尝试将其转换为IEnumberable(列表)类型,但它抛出异常并说不能转换。另一个问题是,它是一个只读属性,这使得实际上不可能创建一个新的EventLog对象并手动向其添加条目。最初我尝试的是:

List<EventLog> filteredList = EventLog.GetEventLogs().Where(
x => string.Equals(x.LogDisplayName, "Some Value")).Where(x => x.Entries.Where(...

但显然Entries.Where()不会工作,因为它不是IEnumberable。我已经想了好几个小时的替代方案了,但我现在毫无希望了。如有任何帮助,不胜感激。

在非ienumerable类型上使用lambda表达式过滤Windows日志

EventLogEntryCollection(查询中x.Entries返回的对象类型)仅实现IEnumerable,而不是通用的IEnumerable<EventLogEntry>。要在Linq方法中使用它,您必须强制转换每个元素:

x => x.Entries.Cast<EventLogEntry>().Where(...

Cast<T>()接受任何IEnumerable并返回IEnumerable<T>,其中每个元素都简单地强制转换为所请求的类型,如果失败则引发ClassCastException。由于EventLogEntry是该集合中唯一的对象类型,因此这是一个安全的操作。

(OfType<T>())是类似的,除了它将省略不能被强制转换为所请求类型的元素,而不是引发异常。在这种特殊情况下,可观察的行为应该是相同的。)