.NET 4.x Передача события в делегате - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Народ, у меня тут есть вот такое учебное задание: Разработать класс - коллекцию, generic Реализующую интерфейсы ICollection<T> и IEnumerable<T> Внутри класс должен использовать для хранения только стандартные массивы. Предусмотреть делегат для вызова при изменениях в коллекции. Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get. Я сделал всё, кроме вот этого: Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get. Вот код MyCollection.cs:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Task10_Collections
{
    public class MyCollection : IEnumerable<int>, ICollection<int>
    {
        int[] intArr = new int[0];

        enum eventType
        {
            Added,
            Deleted,
            Updated,
            Get
        };
 
        public MyCollection()
        {
           
        }
 
        public int[] IntArr
        {
            get { return intArr; }
        }

        /// <summary>
        /// CopyTo - метод копирует элементы коллекции intArr в массив myArr,
        /// начиная с индекса index
        /// </summary>
        /// <param name="myArr">Массив, куда надо скопировать
        /// элементы коллекции intArr</param>
        /// <param name="index">Индекс, начиная с которого элементы
        /// будут копироваться из коллекции intArr в массив myArr
        /// </param>
        public void CopyTo(int[] myArr, int index)
        {
            intArr.CopyTo(myArr, index);
        }
 
        public void Add(int item)
        {
            var newArray = new int[intArr.Length + 1];//Создание нового массива (на 1 больше старого)
            intArr.CopyTo(newArray, 0);//Копирование старого массива в новый
            newArray[newArray.Length - 1] = item;//Помещение нового значения в конец массива
            intArr = newArray;//Замена старого масива на новый
        }
 
        public bool Contains(int item)
        {
            bool found = false;
 
            foreach (int elem in intArr)
            {
                // Equality defined by the Box
                // class's implmentation of IEquitable<T>.
                if (elem.Equals(item))
                {
                    found = true;
                }
            }
 
            return found;
        }
 
        public bool Remove(int elem)
        {
            if (intArr.Contains(elem))
            {
                //3 6 7 8 0 4
                //Надо 8 удалить например
                //Новый массив: 3 6 7 0 4
                int[] buf = intArr;
                int[] newArray = new int[intArr.Length - 1];//Создание нового массива (на 1 меньше старого)
 
                int i = 0;
                int j = 0;
 
                while (i < intArr.Length && j<newArray.Length)
                {
                    if (elem != intArr[i])
                    {
                        newArray[j] = intArr[i];
                        j++;
                    }
 
                    i++;
 
                }
                intArr = newArray;
            }
 
            return false;
        }

        // Добавляем элемент, если его нет в коллекции

        public void Clear()
        {
            intArr = new int[0];
        }

        public int Count
        {
            get { return intArr.Length; }
        }
 
        public bool IsReadOnly
        {
            get { return true; }
        }

        //Реализация IEnumerable<int>
        IEnumerator<int> IEnumerable<int>.GetEnumerator()
        {
            return ((IEnumerable<int>)intArr).GetEnumerator();
        }

        public IEnumerator GetEnumerator()
        {
            return ((IEnumerable<int>)intArr).GetEnumerator();
        }
        
       public void printCollection(int[] col)
        {
            foreach (int item in col)
                Console.WriteLine(item + "  \n");
            Console.ReadLine();
        }

    }
}
Вот код Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Task10_Collections
{
    class Program
    {
        delegate void AddItem(int item);//Объявляем делегат на добавление
        delegate void CopyTo(int[] arr, int index);//Делегат на копирование
        delegate bool Contains(int item);//делегат на копирование
        delegate bool Remove(int elem);//Делегат на удаление
        delegate void Clear();//Делегат на очистку коллекции
        delegate void Print(int[] col);//Делегат на распечатку коллекции

        static void Main(string[] args)
        {
 
            MyCollection myCol = new MyCollection();

            AddItem add;
            add = myCol.Add;
            add.Invoke(4);
            add.Invoke(5);
            add.Invoke(9);
            add.Invoke(1);

            myCol.printCollection(myCol.IntArr);

        }
    }
}
Гуглить пробовал - ничего так и не нашёл, помогите пожалуйста, или дайте ссылку с примерами, где разжевано, как именно делегат должен передавать тип события?

Решение задачи: «.NET 4.x Передача события в делегате»

textual
Листинг программы
using System;
using System.Collections;
using System.Collections.Generic;
 
namespace Cyberforum
{
    public class MyCollectionEventArgs : EventArgs
    {
        public enum EventType
        {
            Added,
            Deleted,
            Updated,
            Get
        };
 
        public readonly EventType eventType;
 
        public MyCollectionEventArgs(EventType eventType)
        {
            this.eventType = eventType;
        }
    }
 
    public class MyCollection<T> : IEnumerable<T>, ICollection<T>
    {
        private T[] arr = new T[10];
        private int elementsInArr = 0;
        public event EventHandler<MyCollectionEventArgs> CollectionChanged;
 
        public int Count { get { return elementsInArr; } }
 
        public bool IsReadOnly { get { return false; } }
 
        public T this[int idx]
        {
            get
            {
                if (elementsInArr <= idx)
                    throw new IndexOutOfRangeException();
                CollectionChanged?.Invoke(this, 
                    new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Get));
                return arr[idx];
            }
            set
            {
                if (elementsInArr <= idx)
                    throw new IndexOutOfRangeException();
                CollectionChanged?.Invoke(this,
                    new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Updated));
                arr[idx] = value;
            }
        }
 
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = 0; i < elementsInArr; ++i)
                yield return arr[i];
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
 
        public void Add(T item)
        {
            if (arr.Length == elementsInArr)
            {
                T[] tmpArr = new T[arr.Length + arr.Length / 2];
                arr.CopyTo(tmpArr, 0);
                arr = tmpArr;
            }
            arr[elementsInArr++] = item;
            CollectionChanged?.Invoke(this,
                new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Added));
        }
 
        public void Clear()
        {
            elementsInArr = 0;
            arr = new T[10];
            CollectionChanged?.Invoke(this,
                new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Deleted));
        }
 
        public bool Contains(T item)
        {
            for (int i = 0; i < elementsInArr; ++i)
                if (arr[i].Equals(item))
                    return true;
            return false;
        }
 
        public void CopyTo(T[] array, int arrayIndex)
        {
            for (int i = arrayIndex; i < elementsInArr; ++i)
                array[i] = arr[i];
        }
 
        public bool Remove(T item)
        {
            int idx = 0;
            for (; idx < elementsInArr; ++idx)
                if (arr[idx].Equals(item))
                    break;
            if (idx == elementsInArr)
                return false;
 
            for (int i = idx + 1; i < elementsInArr; ++i)
                arr[i - 1] = arr[i];
            --elementsInArr;
            CollectionChanged?.Invoke(this,
                new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Deleted));
            return true;
        }
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
            MyCollection<string> coll = new MyCollection<string>
            {
                "Hello",
                "[FENIX]",
                "from cyberforum"
            };
            coll.CollectionChanged += printEvent;
 
            foreach (string el in coll)
                Console.WriteLine(el);
 
            coll.Add("How are you?");
            coll[3] = "Fine";
            Console.WriteLine(coll[3]);
 
            foreach (string el in coll)
                Console.WriteLine(el);
 
            coll.Remove("Hello");
 
            foreach (string el in coll)
                Console.WriteLine(el);
 
        }
 
        static void printEvent(object sender, MyCollectionEventArgs e)
        {
            Console.Write("===Event: ");
            switch (e.eventType)
            {
                case MyCollectionEventArgs.EventType.Added:
                    Console.Write("New element added");
                    break;
 
                case MyCollectionEventArgs.EventType.Deleted:
                    Console.Write("Element(s) deleted");
                    break;
 
                case MyCollectionEventArgs.EventType.Get:
                    Console.Write("Got element");
                    break;
 
                case MyCollectionEventArgs.EventType.Updated:
                    Console.Write("Collection updated");
                    break;
            }
            Console.WriteLine("===");
 
        }
    }
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.286 из 5