Есть ли встроенный метод для двоичного поиска по записям в коллекции .NET EventLog.Entries? - PullRequest
0 голосов
/ 13 апреля 2009

Я занимаюсь разработкой службы анализа журналов, которая фиксирует определенные события безопасности в журнале событий Windows. Первоначально я хотел использовать Microsoft LogParser , но я не ищу никаких функций, кроме выбора конкретных экземпляров / идентификаторов событий, уже известных заранее.

После некоторого тестирования я обнаружил, что итерация по всей коллекции .NET EventLog.Entries была в 3 раза быстрее при извлечении данных, чем при запросе Microsoft LogParser.

В конечном итоге данные, которые нужно извлечь, будут сохранены в базе данных SQL Server. Поскольку служба будет выполнять эту обязанность ежедневно, я хочу избегать повторяющихся записей, и мне потребуется способ найти следующую запись в коллекции EventLog.Entries, которой еще нет в базе данных. Я могу начать вставку в базу данных, как только найду эту начальную запись.

Я как раз собирался написать бинарный поиск, чтобы найти эту запись, используя самое последнее поле DATETIME timestamp из базы данных и сравнивая его со свойством TimeWritten из элемента в коллекции EventLog.Entries. Это я могу сделать, но мне интересно, есть ли уже встроенный метод для выполнения этого поиска?

Ответы [ 2 ]

1 голос
/ 14 апреля 2009

Я написал свою собственную, так как не смог найти встроенную реализацию:

/// <summary>
/// Performs a binary search on a specified EventLogEntryCollection's
/// TimeWritten property
/// </summary>
/// <param name="entries">The collection to search</param>
/// <param name="value">The timestamp value being searched</param>
/// <param name="low">The lower-bound search index</param>
/// <param name="high">The upper-bound search index</param>
/// <returns>The index of a matching timestamp, or -1 if not found</returns>
private int BinarySearch(EventLogEntryCollection entries, DateTime value, int low, int high)
{
    if (high < low)
        return -1;
    int mid = low + ((high - low) / 2);
    if (entries[mid].TimeWritten > value)
        return BinarySearch(entries, value, low, mid - 1);
    else if (entries[mid].TimeWritten < value)
        return BinarySearch(entries, value, mid + 1, high);
    else
        return mid;
}
0 голосов
/ 14 апреля 2009

Я не знаю о EventLogEntryCollection, но если вам нужен общий алгоритм двоичного поиска, вы можете использовать тот, который реализован в PowerCollections библиотеке.

...