using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyCollections
{
public interface IIdentifier
{
string Key
{
get;
set;
}
}
public class CollectionBase<TItem> : IList<TItem> where TItem : class, IIdentifier
{
private IDictionary<string, TItem> _itemsMap = new Dictionary<string, TItem>();
private List<TItem> _items = new List<TItem>();
public virtual void Add(Object item)
{
TItem ii = item as TItem;
if (ii == null)
{
return;
}
this[ii.Key] = ii;
}
public TItem this[string key]
{
get
{
return _itemsMap[key];
}
set
{
try
{
if (value == null)
{
return;
}
_items.Add(value);
_itemsMap[value.Key] = value;
}
catch (ArgumentOutOfRangeException)
{
}
}
}
#region IList<TItem> Members
int IList<TItem>.IndexOf(TItem item)
{
return _items.IndexOf(item);
}
void IList<TItem>.Insert(int index, TItem item)
{
try
{
if (item == null)
{
return;
}
_items.Insert(index, item);
_itemsMap[item.Key] = item;
}
catch (ArgumentOutOfRangeException)
{
}
}
void IList<TItem>.RemoveAt(int index)
{
try
{
TItem item = _items[index];
_items.RemoveAt(index);
_itemsMap.Remove(item.Key);
}
catch (ArgumentOutOfRangeException)
{
}
}
TItem IList<TItem>.this[int index]
{
get
{
return _items[index];
}
set
{
try
{
if (value == null)
{
return;
}
_items[index] = value;
_itemsMap[value.Key] = value;
}
catch (ArgumentOutOfRangeException)
{
}
}
}
#endregion
#region ICollection<TItem> Members
void ICollection<TItem>.Add(TItem item)
{
if (item == null)
{
return;
}
_items.Add(item);
_itemsMap[item.Key] = item;
}
void ICollection<TItem>.Clear()
{
_items.Clear();
_itemsMap.Clear();
}
bool ICollection<TItem>.Contains(TItem item)
{
if (item == null)
{
return false;
}
return _itemsMap.ContainsKey(item.Key);
}
void ICollection<TItem>.CopyTo(TItem[] array, int arrayIndex)
{
throw new NotImplementedException();
}
int ICollection<TItem>.Count
{
get { return _items.Count(); }
}
bool ICollection<TItem>.IsReadOnly
{
get { return false; }
}
bool ICollection<TItem>.Remove(TItem item)
{
if (item == null)
{
return false;
}
if (_itemsMap.ContainsKey(item.Key) == true)
{
_itemsMap.Remove(item.Key);
_items.Remove(item);
return true;
}
return false;
}
#endregion
#region IEnumerable<TItem> Members
IEnumerator<TItem> IEnumerable<TItem>.GetEnumerator()
{
return _items.GetEnumerator();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _items.GetEnumerator();
}
#endregion
}
}