Collections Data Structure C#

using System;
using System.Collections.Generic;
using System.Text;
namespace System.Collections.Generic
{
  public class ItemAtEventArgs : EventArgs
  {
    public readonly T Item;
    public readonly int Index;
    public ItemAtEventArgs(T item, int index) { Item = item; Index = index; }
    public override string ToString()
    {
      return String.Format("(ItemAtEventArgs {0} '{1}')", Index, Item);
    }
  }
  public class ItemRangeEventArgs : EventArgs
  {
    public readonly T[] Items;
    public readonly int Index, Count;
    public ItemRangeEventArgs(T[] items, int index, int count) { Items = items; Index = index; Count = count; }
    public override string ToString()
    {
      return String.Format("(ItemRangeEventArgs {0} Cnt: {2})", Index, Items, Count);
    }
  }
  public class EventedList : List
  {
    public EventedList() : base() { }
    public EventedList(int capacity) : base(capacity) { }
    public EventedList(IEnumerable collection) : base(collection) { }
    public event ItemInsertedHandler ItemInserted;
    public event ItemRemovedHandler ItemRemoved;
    public event ItemRangeInsertedHandler ItemRangeInserted;
    public event ItemRangeRemovedHandler ItemRangeRemoved;
    public delegate void ItemInsertedHandler(object sender, ItemAtEventArgs e);
    public delegate void ItemRemovedHandler(object sender, ItemAtEventArgs e);
    public delegate void ItemRangeInsertedHandler(object sender, ItemRangeEventArgs e);
    public delegate void ItemRangeRemovedHandler(object sender, ItemRangeEventArgs e);
    protected virtual void OnItemRemoved(ItemAtEventArgs e)
    {
      ItemRemovedHandler handler1 = this.ItemRemoved;
      if (handler1 != null)
        handler1(this, e);
    }
    protected virtual void OnItemInserted(ItemAtEventArgs e)
    {
      ItemInsertedHandler handler1 = this.ItemInserted;
      if (handler1 != null)
        handler1(this, e);
    }
    protected virtual void OnItemRangeRemoved(ItemRangeEventArgs e)
    {
      ItemRangeRemovedHandler handler1 = this.ItemRangeRemoved;
      if (handler1 != null)
        handler1(this, e);
    }
    protected virtual void OnItemRangeInserted(ItemRangeEventArgs e)
    {
      ItemRangeInsertedHandler handler1 = this.ItemRangeInserted;
      if (handler1 != null)
        handler1(this, e);
    }
    public new void Add(T item)
    {
      base.Add(item);
      OnItemInserted(new ItemAtEventArgs(item, base.Count - 1));
    }
    public new void AddRange(IEnumerable collection)
    {
      this.InsertRange(base.Count, collection);
    }
    public new void Insert(int index, T item)
    {
      base.Insert(index, item);
      OnItemInserted(new ItemAtEventArgs(item, index));
    }
    public new void InsertRange(int index, IEnumerable collection)
    {
      int count = base.Count;
      base.InsertRange(index, collection);
      count = base.Count - count;
      OnItemRangeInserted(new ItemRangeEventArgs(base.GetRange(index, count).ToArray(), index, count));
    }
    public new bool Remove(T item)
    {
      int num1 = base.IndexOf(item);
      if (num1 >= 0)
      {
        this.RemoveAt(num1);
        return true;
      }
      return false;
    }
    public new void RemoveAt(int index)
    {
      T item = base[index];
      base.RemoveAt(index);
      OnItemRemoved(new ItemAtEventArgs(item, index));
    }
    public new void RemoveRange(int index, int count)
    {
      List rc = base.GetRange(index, count);
      base.RemoveRange(index, count);
      OnItemRangeRemoved(new ItemRangeEventArgs(rc.ToArray(), index, count));
    }
  }
}