using System.Collections.Generic;
public static void Main()
InOutEvent inOutMethods = new InOutEvent();
ItemsList<ICommonData> queue = new ItemsList<ICommonData>();
queue.enteredItemEvent += inOutMethods.InItem;
queue.removedItemEvent += inOutMethods.OutItem;
for (int i = 1; i < 11; i++)
BookEventArgs book = new BookEventArgs("My Book Eddition No.: " + i, "Ashraf Abouelnaga", 2000 + i);
BookEventArgs addedBook = new BookEventArgs("My Book Eddition No.: " + 11, "Ashraf Abouelnaga", 2000 + 11);
queue.AddToQueue(addedBook);
Console.WriteLine("Items List:");
public interface ICommonData
string Name { get; set; }
public class BookEventArgs : EventArgs,ICommonData
public string Name { get; set; }
public string Author { get; set; }
public int PublishYear { get; set; }
public BookEventArgs() { }
public BookEventArgs(string _name, string _author, int _published)
PublishYear = _published;
public string GetObjectData()
return $"Author: {Author}, Book Name: {Name}, Published in: {PublishYear}.";
public delegate void ItemInEvent(object sender, ICommonData e);
public delegate void ItemOutEvent(object sender, ICommonData e);
public void InItem(object sender, ICommonData e)
Console.WriteLine($"Item Entered, {e.GetObjectData()}");
public void OutItem(object sender, ICommonData e)
Console.WriteLine($"Item Removed, {e.GetObjectData()}");
public class ItemsList<T> where T : class, ICommonData
public event ItemInEvent enteredItemEvent;
public event ItemOutEvent removedItemEvent;
private IList<T> queueData;
queueData = new List<T>();
public void AddToQueue(T inputData)
queueData.Add(inputData);
RaiseEnterItemEvent(inputData);
protected virtual void RaiseEnterItemEvent(T item)
if (enteredItemEvent != null)
enteredItemEvent(this, item);
public void RemoveFromQueue()
outData = queueData[queueData.Count - 1];
queueData.Remove(outData);
RaiseRemoveItemEvent(outData);
protected virtual void RaiseRemoveItemEvent(T item)
if (removedItemEvent != null)
removedItemEvent(this, item);
public void ViewQueueData()
foreach (var item in queueData)
Console.WriteLine($"Book name: {item.GetObjectData()}");