在非ienumerable类型上使用lambda表达式过滤Windows日志
本文关键字:表达式 过滤 Windows 日志 lambda ienumerable 类型 在非 | 更新日期: 2023-09-27 18:12:04
我试图根据一些标准获取和过滤Windows日志,其中一个是Message
过滤。Message
的性质在EventLog.GetEventLogs().Entries.Message
中。问题是Entries
是EventLogEntryCollection
,我不能在上面运行lambda表达式(其中)。我还尝试将其转换为IEnumberable(列表)类型,但它抛出异常并说不能转换。另一个问题是,它是一个只读属性,这使得实际上不可能创建一个新的EventLog
对象并手动向其添加条目。最初我尝试的是:
List<EventLog> filteredList = EventLog.GetEventLogs().Where(
x => string.Equals(x.LogDisplayName, "Some Value")).Where(x => x.Entries.Where(...
但显然Entries.Where()
不会工作,因为它不是IEnumberable。我已经想了好几个小时的替代方案了,但我现在毫无希望了。如有任何帮助,不胜感激。
EventLogEntryCollection
(查询中x.Entries
返回的对象类型)仅实现IEnumerable
,而不是通用的IEnumerable<EventLogEntry>
。要在Linq方法中使用它,您必须强制转换每个元素:
x => x.Entries.Cast<EventLogEntry>().Where(...
Cast<T>()
接受任何IEnumerable
并返回IEnumerable<T>
,其中每个元素都简单地强制转换为所请求的类型,如果失败则引发ClassCastException。由于EventLogEntry
是该集合中唯一的对象类型,因此这是一个安全的操作。
(OfType<T>()
)是类似的,除了它将省略不能被强制转换为所请求类型的元素,而不是引发异常。在这种特殊情况下,可观察的行为应该是相同的。)