Как проверить, добавляется ли SortedDictionary, обновляется или удаляется в C # - PullRequest
0 голосов
/ 19 мая 2019

У меня есть SortedDictionary событий, на которые люди могут купить билеты. Код события является уникальным для того билета, который хранится в качестве ключа.

protected SortedDictionary<int, Event> Events = new SortedDictionary<int, Event>();

Пример этого будет выглядеть так:

Events.Add(123, new Event(...));

Я реализовал регистратор, чтобы иметь возможность отслеживать событие. Который выглядит так:

class EventLogger
{
    protected SortedDictionary<int, EventLogType[]> Events = new SortedDictionary<int, EventLogType[]>();

    public EventLogger()
    {

    }

    public void Log(int eventCode, EventLogType type)
    {
        KeyValuePair<int, EventLogType[]> e;

        if (Events.ContainsKey(eventCode))
        {
            (e = Events.FirstOrDefault(x => x.Key.Equals(eventCode)))
                .Value[e.Value.Count()] = type;
        }
        else Events.Add(eventCode, new EventLogType[] { type });
    }
}

enum EventLogType
{
    PURCHASE,
    CREATE,
    UPDATE,
    DELETE
}

Когда, например, я создаю событие, мне нужно теперь вызвать этот метод журнала:

(new EventLogger()).Log(123, EventLogType.CREATE); // EventLogger instance is stored static

Что становится серьезной болью, когда я хочу обновить, удалить или создать. Я посмотрел на SO об изменении, как set работает для массива, и попытался это:

protected SortedDictionary<int, Event> Events { get; set {
    this.save();
} } = new SortedDictionary<int, Event>();

Но это выдает ошибку IDE:

Только инициализированные свойства могут иметь инициализаторы.

Как получить доступ к вызову set до того, как что-либо будет сохранено или обновлено в массиве. Как я могу проверить, какое действие выполняется? Поэтому вместо того, чтобы делать вызов в журнал отдельно, это можно сделать в .Add или когда его значение обновляется или удаляется?

Мой текущий код выглядит так:

Events.Add(123, new Event(...));
Logger.Log(123, EventLogType.CREATE);

Где, как я хочу, чтобы регистрировать создание, когда я просто звоню на .Add

1 Ответ

1 голос
/ 19 мая 2019

Почему вы не используете наследование? Создайте собственный, например, «MySortedDictionary», который наследуется от SortedDictionary, и добавьте необходимые события в ваш «MySortedDictionary».

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

using System;
using System.Collections.Generic;

namespace SortedDictionrayTest
{

    class AddingEventArgs<TKey, TValue> : EventArgs
    {
        public TKey Key
        {
            get;
        }

        public TValue Value
        {
            get;
        }

        public AddingEventArgs(TKey key, TValue value)
        {
            this.Key = key;
            this.Value = value;
        }
    }

    class AddedEventArgs<TKey, TValue> : AddingEventArgs<TKey, TValue>
    {
        public AddedEventArgs(TKey key, TValue value) : base(key, value)
        {
        }
    }

    class MySortedDictionay<TKey, TValue> : SortedDictionary<TKey, TValue>
    {
        public event EventHandler<AddingEventArgs<TKey, TValue>> Adding;
        public event EventHandler<AddedEventArgs<TKey, TValue>> Added;

        public new void Add(TKey key, TValue value)
        {
            this.OnAdding(new AddingEventArgs<TKey, TValue>(key, value));
            base.Add(key, value);
            this.OnAdded(new AddedEventArgs<TKey, TValue>(key, value));
        }

        protected virtual void OnAdding(AddingEventArgs<TKey, TValue> args)
        {
            if (this.Adding != null)
            {
                Adding(this, args);
            }
        }

        protected virtual void OnAdded(AddedEventArgs<TKey,TValue> args)
        {
            if (this.Added != null)
            {
                Added(this, args);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var sortedDict = new MySortedDictionay<int, string>();

            sortedDict.Adding += SortedDict_Adding;
            sortedDict.Added += SortedDict_Added;

            sortedDict.Add(2, "World");
            sortedDict.Add(1, "Hello");

            Console.WriteLine("---");
            foreach (KeyValuePair<int, string> keyValuePair in sortedDict)
            {
                Console.WriteLine($"key: [{keyValuePair.Key}] value: [{keyValuePair.Value}]");
            }
        }

        private static void SortedDict_Adding(object sender, AddingEventArgs<int, string> e)
        {
            Console.WriteLine($"before adding key: [{e.Key}] value: [{e.Value}]");
        }

        private static void SortedDict_Added(object sender, AddedEventArgs<int, string> e)
        {
            Console.WriteLine($"after adding key: [{e.Key}] value: [{e.Value}]");
        }

    }
}
...