.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("===");
}
}
}