Извлечение данных из окна просмотра событий Windows с помощью C # [duplicate]

Самый короткий ответ, вероятно, будет «определение - исполнение», поэтому весь аргумент не имеет строгой точки зрения. В качестве более надуманного примера вы можете привести следующее:

def a(): return []

def b(x=a()):
    print x

. Надеюсь, этого достаточно, чтобы показать, что не выполнять выражения аргументов по умолчанию во время выполнения инструкции def не просто или не работает, т. е. смысл, или и то, и другое.

Я согласен с тем, что при попытке использовать конструкторы по умолчанию, это будет gotcha.

1
задан Dan Abramov 13 June 2011 в 21:23
поделиться

1 ответ

Посмотрев на свой код, дайте краткое описание того, что я буду делать:

Удалите обработчик ProgressChanged. Он предназначен для представления текущего статуса пользователю, которого вы не делаете. Вместо этого вызовите Items.Add в обработчик DoWork.

Создайте EventLog один раз. Это кажется более приятным и экономит вас от потенциального создания его в цикле, если вы не будете осторожны.

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

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

Наконец, получите элемент по индексу. Если вы посмотрели на документацию , вы заметили бы , есть свойство индексатора, которое получает элемент напрямую по его индексу.

class EntryItem {
    public EntryItem (EventLogEntry entry) 
    {
        EntryIndex = entry.Index;
        ItemText = string.Format ("{0} - {1} - {2}     - {3}",
            entry.Index,
            entry.EntryType,
            entry.TimeWritten,
            entry.Source);
    }

    public string ItemText { get; private set; }
    public int EntryIndex { get; private set; }

    public override string ToString ()
    {
        return ItemText;
    }
}

private EventLog log = new EventLog {
    Log = "System"
};

private void eventLoader_DoWork (object sender, DoWorkEventArgs e)
{
    foreach (EventLogEntry entry in this.log.Entries)
        this.Dispatcher.BeginInvoke (() => eventListBox.Items.Add (new EntryItem (entry)));
}

private void eventListBox_SelectionChanged (object sender, SelectionChangedEventArgs e)
{
    EntryItem item = eventListBox.SelectedItem as EntryItem;
    if (item == null)
        return;

    var entry = log.Entries [item.EntryIndex];
    currentEntryLabel.Content = entry.Message;
}
1
ответ дан Dan Abramov 21 August 2018 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: