Compact strongly typed collection pattern, CollectionBase
[Serializable]
public class LinkCollection : CollectionBase {
public LinkCollection() {}
public LinkCollection(LinkCollection value) {this.AddRange(value);}
public LinkCollection(Link[] value) {this.AddRange(value);}
public Link this[int index] {get {return ((Link)(List[index]));} set {List[index] = value;}}
public int Add(Link value) {return List.Add(value);}
public void AddRange(Link[] value) {for (int i = 0; i < value.Length; i++) Add(value[i]);}
public void AddRange(LinkCollection value) {for (int i = 0; i < value.Count; i++) Add(value[i]);}
public bool Contains(Link value) {return List.Contains(value);}
public void CopyTo(Link[] array, int index) {List.CopyTo(array, index);}
public int IndexOf(Link value) {return List.IndexOf(value);}
public void Insert(int index, Link value) {List.Insert(index, value);}
public new LinkEnumerator GetEnumerator() {return new LinkEnumerator(this);}
public void Remove(Link value) {List.Remove(value);}
public class LinkEnumerator : object, IEnumerator {
private IEnumerator e; private IEnumerable bc;
public LinkEnumerator(LinkCollection c) {bc = c; e = bc.GetEnumerator();}
public Link Current {get {return (Link)e.Current;}}
public bool MoveNext() {return e.MoveNext();}
public void Reset() {e.Reset();}
object IEnumerator.Current {get {return e.Current;}}
bool IEnumerator.MoveNext() {return e.MoveNext();}
void IEnumerator.Reset() {e.Reset();}
}
}