.NET 4.x Передача события в делегате - C#
Формулировка задачи:
Всем привет! Народ, у меня тут есть вот такое учебное задание:
Разработать класс - коллекцию, generic
Реализующую интерфейсы ICollection<T> и IEnumerable<T>
Внутри класс должен использовать для хранения только стандартные массивы.
Предусмотреть делегат для вызова при изменениях в коллекции. Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get.
Я сделал всё, кроме вот этого: Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get.
Вот код MyCollection.cs:
Вот код Program.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();
- }
- }
- }
Листинг программы
- 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("===");
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д