使用非IEnumerable类型上的lambda表达式过滤Windows日志

Ari*_*edi 4 c# linq event-log

我正在尝试根据某些条件获取和过滤Windows日志,其中一个标准是过滤依据Message.该Message物业在EventLog.GetEventLogs().Entries.Message.该问题EntriesEventLogEntryCollection和我不能运行lambda表达式(其中在其上).我也尝试将它转换为IEnumberable(List)类型,但它抛出一个异常并说无法强制转换.另一个问题是它是一个只读属性,这使得创建新EventLog对象并手动添加条目几乎是不可能的.最初我尝试的是:

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

但显然Entries.Where()不会起作用,因为它不是IEnumberable.我已经考虑了几个小时的替代解决方案,但现在我没希望了.任何帮助是极大的赞赏.

cdh*_*wie 7

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

x => x.Entries.Cast<EventLogEntry>().Where(...
Run Code Online (Sandbox Code Playgroud)

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

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