|     //------------------------------------------------------------------------------ | 
| // Copyright (c) Microsoft Corporation.  All rights reserved. | 
| //----------------------------------------------------------------------------- | 
| namespace System.Collections.Generic | 
| { | 
|     using System; | 
|     using System.Collections; | 
|     using System.Diagnostics; | 
|   | 
|     [System.Runtime.InteropServices.ComVisible(false)] | 
|     public class SynchronizedCollection<T> : IList<T>, IList | 
|     { | 
|         List<T> items; | 
|         object sync; | 
|   | 
|         public SynchronizedCollection() | 
|         { | 
|             this.items = new List<T>(); | 
|             this.sync = new Object(); | 
|         } | 
|   | 
|         public SynchronizedCollection(object syncRoot) | 
|         { | 
|             if (syncRoot == null) | 
|                 throw new ArgumentNullException("syncRoot"); | 
|   | 
|             this.items = new List<T>(); | 
|             this.sync = syncRoot; | 
|         } | 
|   | 
|         public SynchronizedCollection(object syncRoot, IEnumerable<T> list) | 
|         { | 
|             if (syncRoot == null) | 
|                 throw new ArgumentNullException("syncRoot"); | 
|             if (list == null) | 
|                 throw new ArgumentNullException("list"); | 
|   | 
|             this.items = new List<T>(list); | 
|             this.sync = syncRoot; | 
|         } | 
|   | 
|         public SynchronizedCollection(object syncRoot, params T[] list) | 
|         { | 
|             if (syncRoot == null) | 
|                 throw new ArgumentNullException("syncRoot"); | 
|             if (list == null) | 
|                 throw new ArgumentNullException("list"); | 
|   | 
|             this.items = new List<T>(list.Length); | 
|             for (int i = 0; i < list.Length; i++) | 
|                 this.items.Add(list[i]); | 
|             this.sync = syncRoot; | 
|         } | 
|   | 
|         public int Count { get { lock (this.sync) { return this.items.Count; } } } | 
|   | 
|         protected List<T> Items | 
|         { | 
|             get { return this.items; } | 
|         } | 
|   | 
|         public object SyncRoot | 
|         { | 
|             get { return this.sync; } | 
|         } | 
|   | 
|         public T this[int index] | 
|         { | 
|             get | 
|             { | 
|                 lock (this.sync) | 
|                 { | 
|                     return this.items[index]; | 
|                 } | 
|             } | 
|             set | 
|             { | 
|                 lock (this.sync) | 
|                 { | 
|                     if (index < 0 || index >= this.items.Count) | 
|                         throw new ArgumentOutOfRangeException("index"); | 
|                     this.SetItem(index, value); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         public void Add(T item) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 int index = this.items.Count; | 
|                 this.InsertItem(index, item); | 
|             } | 
|         } | 
|   | 
|         public void Clear() | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 this.ClearItems(); | 
|             } | 
|         } | 
|   | 
|         public void CopyTo(T[] array, int index) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 this.items.CopyTo(array, index); | 
|             } | 
|         } | 
|   | 
|         public bool Contains(T item) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 return this.items.Contains(item); | 
|             } | 
|         } | 
|   | 
|         public IEnumerator<T> GetEnumerator() | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 return this.items.GetEnumerator(); | 
|             } | 
|         } | 
|   | 
|         public int IndexOf(T item) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 return this.InternalIndexOf(item); | 
|             } | 
|         } | 
|   | 
|         public void Insert(int index, T item) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 if (index < 0 || index > this.items.Count) | 
|                     throw new ArgumentOutOfRangeException("index"); | 
|   | 
|                 this.InsertItem(index, item); | 
|             } | 
|         } | 
|   | 
|         int InternalIndexOf(T item) | 
|         { | 
|             int count = items.Count; | 
|   | 
|             for (int i = 0; i < count; i++) | 
|             { | 
|                 if (object.Equals(items[i], item)) | 
|                 { | 
|                     return i; | 
|                 } | 
|             } | 
|             return -1; | 
|         } | 
|   | 
|         public bool Remove(T item) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 int index = this.InternalIndexOf(item); | 
|                 if (index < 0) | 
|                     return false; | 
|   | 
|                 this.RemoveItem(index); | 
|                 return true; | 
|             } | 
|         } | 
|   | 
|         public void RemoveAt(int index) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 if (index < 0 || index >= this.items.Count) | 
|                     throw new ArgumentOutOfRangeException("index"); | 
|                 this.RemoveItem(index); | 
|             } | 
|         } | 
|   | 
|         protected virtual void ClearItems() | 
|         { | 
|             this.items.Clear(); | 
|         } | 
|   | 
|         protected virtual void InsertItem(int index, T item) | 
|         { | 
|             this.items.Insert(index, item); | 
|         } | 
|   | 
|         protected virtual void RemoveItem(int index) | 
|         { | 
|             this.items.RemoveAt(index); | 
|         } | 
|   | 
|         protected virtual void SetItem(int index, T item) | 
|         { | 
|             this.items[index] = item; | 
|         } | 
|   | 
|         bool ICollection<T>.IsReadOnly | 
|         { | 
|             get { return false; } | 
|         } | 
|   | 
|         IEnumerator IEnumerable.GetEnumerator() | 
|         { | 
|             return ((IList)this.items).GetEnumerator(); | 
|         } | 
|   | 
|         bool ICollection.IsSynchronized | 
|         { | 
|             get { return true; } | 
|         } | 
|   | 
|         object ICollection.SyncRoot | 
|         { | 
|             get { return this.sync; } | 
|         } | 
|   | 
|         void ICollection.CopyTo(Array array, int index) | 
|         { | 
|             lock (this.sync) | 
|             { | 
|                 ((IList)this.items).CopyTo(array, index); | 
|             } | 
|         } | 
|   | 
|         object IList.this[int index] | 
|         { | 
|             get | 
|             { | 
|                 return this[index]; | 
|             } | 
|             set | 
|             { | 
|                 VerifyValueType(value); | 
|                 this[index] = (T)value; | 
|             } | 
|         } | 
|   | 
|         bool IList.IsReadOnly | 
|         { | 
|             get { return false; } | 
|         } | 
|   | 
|         bool IList.IsFixedSize | 
|         { | 
|             get { return false; } | 
|         } | 
|   | 
|         int IList.Add(object value) | 
|         { | 
|             VerifyValueType(value); | 
|   | 
|             lock (this.sync) | 
|             { | 
|                 this.Add((T)value); | 
|                 return this.Count - 1; | 
|             } | 
|         } | 
|   | 
|         bool IList.Contains(object value) | 
|         { | 
|             VerifyValueType(value); | 
|             return this.Contains((T)value); | 
|         } | 
|   | 
|         int IList.IndexOf(object value) | 
|         { | 
|             VerifyValueType(value); | 
|             return this.IndexOf((T)value); | 
|         } | 
|   | 
|         void IList.Insert(int index, object value) | 
|         { | 
|             VerifyValueType(value); | 
|             this.Insert(index, (T)value); | 
|         } | 
|   | 
|         void IList.Remove(object value) | 
|         { | 
|             VerifyValueType(value); | 
|             this.Remove((T)value); | 
|         } | 
|   | 
|         static void VerifyValueType(object value) | 
|         { | 
|             if (value == null) | 
|             { | 
|                 if (typeof(T).IsValueType) | 
|                 { | 
|                     throw new ArgumentException(); | 
|                 } | 
|             } | 
|             else if (!(value is T)) | 
|             { | 
|                 throw new ArgumentException(); | 
|             } | 
|         } | 
|     } | 
| } | 
|   | 
| // File provided for Reference Use Only by Microsoft Corporation (c) 2007. | 
| // Copyright (c) Microsoft Corporation. All rights reserved. |