.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("==="); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д