C#动态列表到静态列表

Dud*_*ord 2 c# event-log

从事件日志类的文档中,EventLogEntryCollection是事件日志条目的动态列表.它建议直接使用Count属性,而不是将其值存储在变量中.实现此行为:

private void ReadEventLog()
{
    EventLog eventLog = new EventLog("Application", "TheGreatestMachineInTheWorld");
    EventLogEntryCollection eventLogEntries = eventLog.Entries;
    for (int i = 0; i < eventLogEntries.Count; i++){
        EventLogEntry entry = eventLog.Entries[i];
        //Do Some processing on the entry
}
Run Code Online (Sandbox Code Playgroud)

对于大型事件日志(> 20000个条目)来说速度很慢.for循环而不是foreach的原因是因为我需要迭代器位置来指示这个东西与完成的接近程度.

存储count变量并迭代:

int eventLogEntryCount = eventLogEntries.Count;
for (int i = 0; i < eventLogEntryCount; i++){
        EventLogEntry entry = eventLog.Entries[i];
        //Do Some processing on the entry
}
Run Code Online (Sandbox Code Playgroud)

提供显着的性能提升.但是,如果在处理发生时写入事件日志,则可能会导致索引超出范围异常.有没有办法静态存储这个列表,所以计数不会改变?

Jon*_*eet 6

有没有办法静态存储这个列表,所以计数不会改变?

这听起来像你想要的东西:

List<EventLogEntry> entries = eventLogEntries.Cast<EventLogEntry>().ToList();
Run Code Online (Sandbox Code Playgroud)

这会将所有日志条目(当时)提取到a中List<T>,然后可以使用索引器或其他条目快速访问foreach.

当然,您可能会发现获取所有日志条目的速度很慢- 您应该尝试一下.