codice:
using System;
using System.Collections;

namespace HostingTestPlatform.Server.Core
{
	/// <summary>
	/// Descrizione di riepilogo per SocketList.
	/// </summary>
	public class SocketList : IList
	{
		#region Double Linked List
		private class SocketItem : IDisposable
		{
			SocketItem head;
			SocketItem prev;
			SocketItem next;
			// HACK: System.Net.Sockets.Socket content;
			string content;

			bool disposed = false;

			// HACK: public SocketItem(SocketItem Head, SocketItem Prev, SocketItem Next, System.Net.Sockets.Socket Content)
			public SocketItem(SocketItem Head, SocketItem Prev, SocketItem Next, string Content)
			{
				this.head = Head;
				this.prev = Prev;
				this.next = Next;
				this.content = Content;
			}

			public bool IsDisposed
			{
				get
				{
					return disposed;
				}
			}

			public SocketItem Head
			{
				get
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("head");
					}

					return head;
				}
				set
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("head");
					}

					head = value;
				}
			}

			public SocketItem Prev
			{
				get
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("prev");
					}

					return prev;
				}
				set
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("prev");
					}

					prev = value;
				}
			}

			public SocketItem Next
			{
				get
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("next");
					}

					return next;
				}
				set
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("next");
					}

					next = value;
				}
			}

			// HACK: public System.Net.Sockets.Socket Content
			public string Content
			{
				get
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("content");
					}

					return content;
				}
				set
				{
					if (disposed == true)
					{
						throw new ObjectDisposedException("content");
					}

					content = value;
				}
			}

			~SocketItem()
			{
				Dispose(false);
			}

			protected virtual void Dispose(bool Disposing)
			{
				if (Disposing == true)
				{
					if (this.disposed == false)
					{
						this.head = null;
						this.prev = null;
						this.next = null;
						this.content = null;

						disposed = true;
					}
				}
			}

			#region Membri di IDisposable
			public void Dispose()
			{
				Dispose(true);

				GC.SuppressFinalize(this);
			}
			#endregion
		}
		#endregion

		SocketItem socketLinkedList;
		int numberOfElements;

		public SocketList()
		{
			//
			// TODO: aggiungere qui la logica del costruttore
			//
			socketLinkedList = null;
			numberOfElements = 1;
		}

		#region Internal Methods
		private void SetNewHead(SocketItem SocketItem)
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return;
			}

			SocketItem currentItem = socketLinkedList.Head;
			do
			{
				currentItem.Head = SocketItem;
			}
			while ((currentItem = currentItem.Next) != null);
		}

		// HACK: private int GetIndexByContent(System.Net.Sockets.Socket content)
		private int GetIndexByContent(string content)
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return -1;
			}

			SocketItem currentItem = socketLinkedList.Head;
			int currentIndex = 0;
			do
			{
				if (currentItem.Content == content)
				{
					break;
				}

				currentIndex++;
			}
			while ((currentItem = currentItem.Next) != null);

			return currentIndex;
		}

		private SocketItem GetItemByIndex(int index)
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return null;
			}

			SocketItem currentItem = socketLinkedList.Head;
			int currentIndex = 0;
			do
			{
				if (currentIndex == index)
				{
					return currentItem;
				}

				currentIndex++;
			}
			while ((currentItem = currentItem.Next) != null);

			return null;
		}

		// HACK: private SocketItem GetItemByContent(System.Net.Sockets.Socket content)
		private SocketItem GetItemByContent(string content)
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return null;
			}

			SocketItem currentItem = socketLinkedList.Head;
			do
			{
				if (currentItem.Content == content)
				{
					return currentItem;
				}
			}
			while ((currentItem = currentItem.Next) != null);

			return null;
		}

		private SocketItem GetLastItem()
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return null;
			}

			SocketItem currentItem = socketLinkedList;
			while(true)
			{
				if (currentItem.Next != null)
				{
					currentItem = currentItem.Next;
				}
				else
				{
					break;
				}
			}

			socketLinkedList = currentItem;

			return currentItem;
		}

		private int CountItems()
		{
			if (socketLinkedList == null || socketLinkedList.IsDisposed)
			{
				return -1;
			}

			SocketItem currentItem = socketLinkedList.Head;
			int count = 0;
			do
			{
				if (currentItem.Next == null)
				{
					break;
				}

				count++;
			}
			while ((currentItem = currentItem.Next) != null);

			return count;
		}
		#endregion

		#region Membri di IList

		public bool IsReadOnly
		{
			get
			{
				return false;
			}
		}

		object IList.this[int index]
		{
			get
			{
				SocketItem requestedItem = GetItemByIndex(index);

				if (requestedItem == null)
				{
					throw new ArgumentOutOfRangeException("index");
				}

				return (object)requestedItem.Content;
			}
			set
			{
				if (value.GetType() != typeof(System.Net.Sockets.Socket))
				{
					throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
				}

				SocketItem requestedItem = GetItemByIndex(index);

				if (requestedItem == null)
				{
					throw new ArgumentOutOfRangeException("index");
				}

				// HACK: requestedItem.Content = (System.Net.Sockets.Socket)value;
				requestedItem.Content = (string)value;
			}
		}

		// HACK: public System.Net.Sockets.Socket this[int index]
		public string this[int index]
		{
			get
			{
				SocketItem requestedItem = GetItemByIndex(index);

				if (requestedItem == null)
				{
					throw new ArgumentOutOfRangeException("index");
				}

				return requestedItem.Content;
			}
			set
			{
				SocketItem requestedItem = GetItemByIndex(index);

				if (requestedItem == null)
				{
					throw new ArgumentOutOfRangeException("index");
				}

				requestedItem.Content = value;
			}
		}

		public void RemoveAt(int index)
		{
			SocketItem requestedItem = GetItemByIndex(index);

			if (requestedItem == null)
			{
				throw new ArgumentOutOfRangeException("index");
			}

			if (requestedItem.Prev == null)
			{
				if (requestedItem.Next == null)
				{
					socketLinkedList = null;
				}
				else
				{
					SetNewHead(requestedItem.Next);
					requestedItem.Next.Prev = null;
					socketLinkedList = requestedItem.Next;
				}
			}
			else
			{
				if (requestedItem.Next != null)
				{
					requestedItem.Prev.Next = requestedItem.Next;
					requestedItem.Next.Prev = requestedItem.Prev;
				}
				else
				{
					requestedItem.Prev.Next = null;
				}
			}

			requestedItem.Dispose();
			requestedItem = null;
		}

		void IList.Insert(int index, object value)
		{
			if (value.GetType() != typeof(System.Net.Sockets.Socket))
			{
				throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
			}

			SocketItem requestedItem = GetItemByIndex(index);

			if (requestedItem == null)
			{
				throw new ArgumentOutOfRangeException("index");
			}
			else
			{
				SocketItem newItem = new SocketItem(
					requestedItem.Head,
					requestedItem.Prev,
					requestedItem,
					// HACK: (System.Net.Sockets.Socket)value);
					(string)value);

				if (requestedItem.Prev == null)
				{
					newItem.Head = newItem;
					SetNewHead(newItem);
				}
				else
				{
					requestedItem.Prev.Next = newItem;
				}

				requestedItem.Prev = newItem;

				numberOfElements++;
			}
		}

		// HACK: public void Insert(int index, System.Net.Sockets.Socket Socket)
		public void Insert(int index, string Socket)
		{
			SocketItem requestedItem = GetItemByIndex(index);

			if (requestedItem == null)
			{
				throw new ArgumentOutOfRangeException("index");
			}
			else
			{
				SocketItem newItem = new SocketItem(
					requestedItem.Head,
					requestedItem.Prev,
					requestedItem,
					Socket);

				if (requestedItem.Prev == null)
				{
					newItem.Head = newItem;
					SetNewHead(newItem);
				}
				else
				{
					requestedItem.Prev.Next = newItem;
				}

				requestedItem.Prev = newItem;

				numberOfElements++;
			}
		}

		void IList.Remove(object value)
		{
			if (value.GetType() != typeof(System.Net.Sockets.Socket))
			{
				throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
			}

			// HACK: SocketItem requestedItem = GetItemByContent((System.Net.Sockets.Socket)value);
			SocketItem requestedItem = GetItemByContent((string)value);

			if (requestedItem == null)
			{
				return;
			}

			if (requestedItem.Prev == null)
			{
				if (requestedItem.Next == null)
				{
					socketLinkedList = null;
				}
				else
				{
					SetNewHead(requestedItem.Next);
					requestedItem.Next.Prev = null;
					socketLinkedList = requestedItem.Next;
				}
			}
			else
			{
				if (requestedItem.Next != null)
				{
					requestedItem.Prev.Next = requestedItem.Next;
					requestedItem.Next.Prev = requestedItem.Prev;
				}
				else
				{
					requestedItem.Prev.Next = null;
				}
			}
			requestedItem.Dispose();
			requestedItem = null;

			numberOfElements--;
		}

		// HACK: public void Remove(System.Net.Sockets.Socket Socket)
		public void Remove(string Socket)
		{
			SocketItem requestedItem = GetItemByContent(Socket);

			if (requestedItem == null)
			{
				return;
			}

			if (requestedItem.Prev == null)
			{
				if (requestedItem.Next == null)
				{
					socketLinkedList = null;
				}
				else
				{
					SetNewHead(requestedItem.Next);
					requestedItem.Next.Prev = null;
					socketLinkedList = requestedItem.Next;
				}
			}
			else
			{
				if (requestedItem.Next != null)
				{
					requestedItem.Prev.Next = requestedItem.Next;
					requestedItem.Next.Prev = requestedItem.Prev;
				}
				else
				{
					requestedItem.Prev.Next = null;
				}
			}
			requestedItem.Dispose();
			requestedItem = null;

			numberOfElements--;
		}

		bool IList.Contains(object value)
		{
			if (value.GetType() != typeof(System.Net.Sockets.Socket))
			{
				throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
			}

			// HACK: if (GetItemByContent((System.Net.Sockets.Socket)value) == null)
			if (GetItemByContent((string)value) == null)
			{
				return false;
			}
			else
			{
				return true;
			}
		}

		// HACK: public bool Contains(System.Net.Sockets.Socket Socket)
		public bool Contains(string Socket)
		{
			if (GetItemByContent(Socket) == null)
			{
				return false;
			}
			else
			{
				return true;
			}
		}

		public void Clear()
		{
			socketLinkedList = null;
			numberOfElements = 0;
		}

		int IList.IndexOf(object value)
		{
			if (value.GetType() != typeof(System.Net.Sockets.Socket))
			{
				throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
			}

			// HACK: return GetIndexByContent((System.Net.Sockets.Socket)value);
			return GetIndexByContent((string)value);
		}

		// HACK: public int IndexOf(System.Net.Sockets.Socket Socket)
		public int IndexOf(string Socket)
		{
			return GetIndexByContent(Socket);
		}

		int IList.Add(object value)
		{
			if (value.GetType() != typeof(System.Net.Sockets.Socket))
			{
				throw new ArgumentException("Value must be a System.Net.Sockets.Socket type");
			}

			SocketItem requestedItem = GetLastItem();

			if (requestedItem == null)
			{
				SocketItem newItem = new SocketItem(
					null,
					null,
					null,
					// HACK: (System.Net.Sockets.Socket)value);
					(string)value);

				newItem.Head = newItem;
				socketLinkedList = newItem;

				numberOfElements = 1;
				return 0;
			}
			else
			{
				SocketItem newItem = new SocketItem(
					requestedItem.Head,
					requestedItem,
					null,
					// HACK: (System.Net.Sockets.Socket)value);
					(string)value);

				requestedItem.Next = newItem;

				numberOfElements++;
				return numberOfElements - 1;
			}
		}