Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Evented List

using System; using System.Collections.Generic; using System.Text; namespace System.Collections.Generic {   public class ItemAtEventArgs<T> : 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<T> : 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<T> : List<T>   {     public EventedList() : base() { }     public EventedList(int capacity) : base(capacity) { }     public EventedList(IEnumerable<T> 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<T> e);     public delegate void ItemRemovedHandler(object sender, ItemAtEventArgs<T> e);     public delegate void ItemRangeInsertedHandler(object sender, ItemRangeEventArgs<T> e);     public delegate void ItemRangeRemovedHandler(object sender, ItemRangeEventArgs<T> e);     protected virtual void OnItemRemoved(ItemAtEventArgs<T> e)     {       ItemRemovedHandler handler1 = this.ItemRemoved;       if (handler1 != null)         handler1(this, e);     }     protected virtual void OnItemInserted(ItemAtEventArgs<T> e)     {       ItemInsertedHandler handler1 = this.ItemInserted;       if (handler1 != null)         handler1(this, e);     }     protected virtual void OnItemRangeRemoved(ItemRangeEventArgs<T> e)     {       ItemRangeRemovedHandler handler1 = this.ItemRangeRemoved;       if (handler1 != null)         handler1(this, e);     }     protected virtual void OnItemRangeInserted(ItemRangeEventArgs<T> e)     {       ItemRangeInsertedHandler handler1 = this.ItemRangeInserted;       if (handler1 != null)         handler1(this, e);     }     public new void Add(T item)     {       base.Add(item);       OnItemInserted(new ItemAtEventArgs<T>(item, base.Count - 1));     }     public new void AddRange(IEnumerable<T> collection)     {       this.InsertRange(base.Count, collection);     }     public new void Insert(int index, T item)     {       base.Insert(index, item);       OnItemInserted(new ItemAtEventArgs<T>(item, index));     }     public new void InsertRange(int index, IEnumerable<T> collection)     {       int count = base.Count;       base.InsertRange(index, collection);       count = base.Count - count;       OnItemRangeInserted(new ItemRangeEventArgs<T>(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<T>(item, index));     }     public new void RemoveRange(int index, int count)     {       List<T> rc = base.GetRange(index, count);       base.RemoveRange(index, count);       OnItemRangeRemoved(new ItemRangeEventArgs<T>(rc.ToArray(), index, count));     }   } }