加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在非IEnumerable类型上使用lambda表达式过滤Windows日志

发布时间:2020-12-16 01:54:43 所属栏目:百科 来源:网络整理
导读:我正在尝试根据某些条件获取和过滤 Windows日志,其中一个标准是按消息过滤. Message属性位于EventLog.GetEventLogs().Entries.Message中.问题是Entries是一个EventLogEntryCollection,我无法在其上运行lambda表达式(where).我也尝试将它转换为IEnumberable(L
我正在尝试根据某些条件获取和过滤 Windows日志,其中一个标准是按消息过滤. Message属性位于EventLog.GetEventLogs().Entries.Message中.问题是Entries是一个EventLogEntryCollection,我无法在其上运行lambda表达式(where).我也尝试将它转换为IEnumberable(List)类型,但它抛出一个异常并说无法强制转换.另一个问题是它是一个只读属性,这使得创建一个新的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>()是相似的,除了它将省略不能转换为请求类型的元素而不是引发异常.在这种特殊情况下,可观察行为应该是相同的.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读