如何检查是否在C#

时间:2019-05-19 18:59:32

标签: c# set sorteddictionary

我有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
}

例如,当我创建一个事件时,我现在必须调用此Log方法:

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

每当我要更新,删除或创建时,这都会变得很痛苦。我研究了如何更改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 个答案:

答案 0 :(得分:1)

为什么不使用继承? 创建一个自己的示例,例如“ 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}]");
        }

    }
}