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

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

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

Всем привет! Народ, у меня тут есть вот такое учебное задание: Разработать класс - коллекцию, generic Реализующую интерфейсы ICollection<T> и IEnumerable<T> Внутри класс должен использовать для хранения только стандартные массивы. Предусмотреть делегат для вызова при изменениях в коллекции. Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get. Я сделал всё, кроме вот этого: Делегат должен передавать изменяемый объект и тип события (определен через enum) - Added, Deleted, Updated, Get. Вот код MyCollection.cs:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace Task10_Collections
  8. {
  9. public class MyCollection : IEnumerable<int>, ICollection<int>
  10. {
  11. int[] intArr = new int[0];
  12.  
  13. enum eventType
  14. {
  15. Added,
  16. Deleted,
  17. Updated,
  18. Get
  19. };
  20. public MyCollection()
  21. {
  22. }
  23. public int[] IntArr
  24. {
  25. get { return intArr; }
  26. }
  27.  
  28. /// <summary>
  29. /// CopyTo - метод копирует элементы коллекции intArr в массив myArr,
  30. /// начиная с индекса index
  31. /// </summary>
  32. /// <param name="myArr">Массив, куда надо скопировать
  33. /// элементы коллекции intArr</param>
  34. /// <param name="index">Индекс, начиная с которого элементы
  35. /// будут копироваться из коллекции intArr в массив myArr
  36. /// </param>
  37. public void CopyTo(int[] myArr, int index)
  38. {
  39. intArr.CopyTo(myArr, index);
  40. }
  41. public void Add(int item)
  42. {
  43. var newArray = new int[intArr.Length + 1];//Создание нового массива (на 1 больше старого)
  44. intArr.CopyTo(newArray, 0);//Копирование старого массива в новый
  45. newArray[newArray.Length - 1] = item;//Помещение нового значения в конец массива
  46. intArr = newArray;//Замена старого масива на новый
  47. }
  48. public bool Contains(int item)
  49. {
  50. bool found = false;
  51. foreach (int elem in intArr)
  52. {
  53. // Equality defined by the Box
  54. // class's implmentation of IEquitable<T>.
  55. if (elem.Equals(item))
  56. {
  57. found = true;
  58. }
  59. }
  60. return found;
  61. }
  62. public bool Remove(int elem)
  63. {
  64. if (intArr.Contains(elem))
  65. {
  66. //3 6 7 8 0 4
  67. //Надо 8 удалить например
  68. //Новый массив: 3 6 7 0 4
  69. int[] buf = intArr;
  70. int[] newArray = new int[intArr.Length - 1];//Создание нового массива (на 1 меньше старого)
  71. int i = 0;
  72. int j = 0;
  73. while (i < intArr.Length && j<newArray.Length)
  74. {
  75. if (elem != intArr[i])
  76. {
  77. newArray[j] = intArr[i];
  78. j++;
  79. }
  80. i++;
  81. }
  82. intArr = newArray;
  83. }
  84. return false;
  85. }
  86.  
  87. // Добавляем элемент, если его нет в коллекции
  88.  
  89. public void Clear()
  90. {
  91. intArr = new int[0];
  92. }
  93.  
  94. public int Count
  95. {
  96. get { return intArr.Length; }
  97. }
  98. public bool IsReadOnly
  99. {
  100. get { return true; }
  101. }
  102.  
  103. //Реализация IEnumerable<int>
  104. IEnumerator<int> IEnumerable<int>.GetEnumerator()
  105. {
  106. return ((IEnumerable<int>)intArr).GetEnumerator();
  107. }
  108.  
  109. public IEnumerator GetEnumerator()
  110. {
  111. return ((IEnumerable<int>)intArr).GetEnumerator();
  112. }
  113. public void printCollection(int[] col)
  114. {
  115. foreach (int item in col)
  116. Console.WriteLine(item + " \n");
  117. Console.ReadLine();
  118. }
  119.  
  120. }
  121. }
Вот код Program.cs:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace Task10_Collections
  7. {
  8. class Program
  9. {
  10. delegate void AddItem(int item);//Объявляем делегат на добавление
  11. delegate void CopyTo(int[] arr, int index);//Делегат на копирование
  12. delegate bool Contains(int item);//делегат на копирование
  13. delegate bool Remove(int elem);//Делегат на удаление
  14. delegate void Clear();//Делегат на очистку коллекции
  15. delegate void Print(int[] col);//Делегат на распечатку коллекции
  16.  
  17. static void Main(string[] args)
  18. {
  19. MyCollection myCol = new MyCollection();
  20.  
  21. AddItem add;
  22. add = myCol.Add;
  23. add.Invoke(4);
  24. add.Invoke(5);
  25. add.Invoke(9);
  26. add.Invoke(1);
  27.  
  28. myCol.printCollection(myCol.IntArr);
  29.  
  30. }
  31. }
  32. }
Гуглить пробовал - ничего так и не нашёл, помогите пожалуйста, или дайте ссылку с примерами, где разжевано, как именно делегат должен передавать тип события?

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

textual
Листинг программы
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. namespace Cyberforum
  6. {
  7.     public class MyCollectionEventArgs : EventArgs
  8.     {
  9.         public enum EventType
  10.         {
  11.             Added,
  12.             Deleted,
  13.             Updated,
  14.             Get
  15.         };
  16.  
  17.         public readonly EventType eventType;
  18.  
  19.         public MyCollectionEventArgs(EventType eventType)
  20.         {
  21.             this.eventType = eventType;
  22.         }
  23.     }
  24.  
  25.     public class MyCollection<T> : IEnumerable<T>, ICollection<T>
  26.     {
  27.         private T[] arr = new T[10];
  28.         private int elementsInArr = 0;
  29.         public event EventHandler<MyCollectionEventArgs> CollectionChanged;
  30.  
  31.         public int Count { get { return elementsInArr; } }
  32.  
  33.         public bool IsReadOnly { get { return false; } }
  34.  
  35.         public T this[int idx]
  36.         {
  37.             get
  38.             {
  39.                 if (elementsInArr <= idx)
  40.                     throw new IndexOutOfRangeException();
  41.                 CollectionChanged?.Invoke(this,
  42.                     new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Get));
  43.                 return arr[idx];
  44.             }
  45.             set
  46.             {
  47.                 if (elementsInArr <= idx)
  48.                     throw new IndexOutOfRangeException();
  49.                 CollectionChanged?.Invoke(this,
  50.                     new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Updated));
  51.                 arr[idx] = value;
  52.             }
  53.         }
  54.  
  55.         public IEnumerator<T> GetEnumerator()
  56.         {
  57.             for (int i = 0; i < elementsInArr; ++i)
  58.                 yield return arr[i];
  59.         }
  60.  
  61.         IEnumerator IEnumerable.GetEnumerator()
  62.         {
  63.             return GetEnumerator();
  64.         }
  65.  
  66.         public void Add(T item)
  67.         {
  68.             if (arr.Length == elementsInArr)
  69.             {
  70.                 T[] tmpArr = new T[arr.Length + arr.Length / 2];
  71.                 arr.CopyTo(tmpArr, 0);
  72.                 arr = tmpArr;
  73.             }
  74.             arr[elementsInArr++] = item;
  75.             CollectionChanged?.Invoke(this,
  76.                 new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Added));
  77.         }
  78.  
  79.         public void Clear()
  80.         {
  81.             elementsInArr = 0;
  82.             arr = new T[10];
  83.             CollectionChanged?.Invoke(this,
  84.                 new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Deleted));
  85.         }
  86.  
  87.         public bool Contains(T item)
  88.         {
  89.             for (int i = 0; i < elementsInArr; ++i)
  90.                 if (arr[i].Equals(item))
  91.                     return true;
  92.             return false;
  93.         }
  94.  
  95.         public void CopyTo(T[] array, int arrayIndex)
  96.         {
  97.             for (int i = arrayIndex; i < elementsInArr; ++i)
  98.                 array[i] = arr[i];
  99.         }
  100.  
  101.         public bool Remove(T item)
  102.         {
  103.             int idx = 0;
  104.             for (; idx < elementsInArr; ++idx)
  105.                 if (arr[idx].Equals(item))
  106.                     break;
  107.             if (idx == elementsInArr)
  108.                 return false;
  109.  
  110.             for (int i = idx + 1; i < elementsInArr; ++i)
  111.                 arr[i - 1] = arr[i];
  112.             --elementsInArr;
  113.             CollectionChanged?.Invoke(this,
  114.                 new MyCollectionEventArgs(MyCollectionEventArgs.EventType.Deleted));
  115.             return true;
  116.         }
  117.     }
  118.  
  119.  
  120.     class Program
  121.     {
  122.         static void Main(string[] args)
  123.         {
  124.             MyCollection<string> coll = new MyCollection<string>
  125.             {
  126.                 "Hello",
  127.                 "[FENIX]",
  128.                 "from cyberforum"
  129.             };
  130.             coll.CollectionChanged += printEvent;
  131.  
  132.             foreach (string el in coll)
  133.                 Console.WriteLine(el);
  134.  
  135.             coll.Add("How are you?");
  136.             coll[3] = "Fine";
  137.             Console.WriteLine(coll[3]);
  138.  
  139.             foreach (string el in coll)
  140.                 Console.WriteLine(el);
  141.  
  142.             coll.Remove("Hello");
  143.  
  144.             foreach (string el in coll)
  145.                 Console.WriteLine(el);
  146.  
  147.         }
  148.  
  149.         static void printEvent(object sender, MyCollectionEventArgs e)
  150.         {
  151.             Console.Write("===Event: ");
  152.             switch (e.eventType)
  153.             {
  154.                 case MyCollectionEventArgs.EventType.Added:
  155.                     Console.Write("New element added");
  156.                     break;
  157.  
  158.                 case MyCollectionEventArgs.EventType.Deleted:
  159.                     Console.Write("Element(s) deleted");
  160.                     break;
  161.  
  162.                 case MyCollectionEventArgs.EventType.Get:
  163.                     Console.Write("Got element");
  164.                     break;
  165.  
  166.                 case MyCollectionEventArgs.EventType.Updated:
  167.                     Console.Write("Collection updated");
  168.                     break;
  169.             }
  170.             Console.WriteLine("===");
  171.  
  172.         }
  173.     }
  174.  
  175. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут