public static UnboundDataItemNode GetUnboundDataItemNode(object dataItem, out UnboundDataItem unboundDataItem)
        {
            lock (UnboundDataItem.UnboundDataItems)
            {
                UnboundDataItemNode current = UnboundDataItem.UnboundDataItems.FirstNode;

                while (current != null)
                {
                    object currentDataItem = current.DataItem;
                    unboundDataItem = current.UnboundDataItem;

                    if (!current.IsAlive)
                    {
                        UnboundDataItemNode next = current.Next;
                        UnboundDataItem.UnboundDataItems.Remove(current);
                        current = next;
                        continue;
                    }

                    if (object.Equals(currentDataItem, dataItem))
                    {
                        return(current);
                    }

                    current = current.Next;
                }

                unboundDataItem = new UnboundDataItem(dataItem);
                UnboundDataItemNode unboundDataItemNode = new UnboundDataItemNode(unboundDataItem);
                UnboundDataItem.UnboundDataItems.Add(unboundDataItemNode);
                return(unboundDataItemNode);
            }
        }
    public static UnboundDataItemNode GetUnboundDataItemNode( object dataItem, out UnboundDataItem unboundDataItem )
    {
      lock( UnboundDataItem.UnboundDataItems )
      {
        UnboundDataItemNode current = UnboundDataItem.UnboundDataItems.FirstNode;

        while( current != null )
        {
          object currentDataItem = current.DataItem;
          unboundDataItem = current.UnboundDataItem;

          if( !current.IsAlive )
          {
            UnboundDataItemNode next = current.Next;
            UnboundDataItem.UnboundDataItems.Remove( current );
            current = next;
            continue;
          }

          if( object.Equals( currentDataItem, dataItem ) )
            return current;

          current = current.Next;
        }

        unboundDataItem = new UnboundDataItem( dataItem );
        UnboundDataItemNode unboundDataItemNode = new UnboundDataItemNode( unboundDataItem );
        UnboundDataItem.UnboundDataItems.Add( unboundDataItemNode );
        return unboundDataItemNode;
      }
    }
 public static void FreeUnboundDataItem(UnboundDataItemNode unboundDataItemNode)
 {
     lock (UnboundDataItem.UnboundDataItems)
     {
         UnboundDataItems.Remove(unboundDataItemNode);
     }
 }
 public static void FreeUnboundDataItem( UnboundDataItemNode unboundDataItemNode )
 {
   lock( UnboundDataItem.UnboundDataItems )
   {
     UnboundDataItems.Remove( unboundDataItemNode );
   }
 }
            public void Add(UnboundDataItemNode newNode)
            {
                newNode.Next = this.FirstNode;

                if (this.FirstNode != null)
                {
                    this.FirstNode.Previous = newNode;
                }

                this.FirstNode = newNode;

                if (this.LastNode == null)
                {
                    this.LastNode = this.FirstNode;
                }

                m_count++;
            }
            public void Remove(UnboundDataItemNode unboundDataItemNode)
            {
                bool removed = false;

                if (this.LastNode == unboundDataItemNode)
                {
                    this.LastNode = unboundDataItemNode.Previous;
                    removed       = true;
                }

                if (this.FirstNode == unboundDataItemNode)
                {
                    this.FirstNode = unboundDataItemNode.Next;
                    removed        = true;
                }

                UnboundDataItemNode previous = unboundDataItemNode.Previous;

                if (previous != null)
                {
                    previous.Next = unboundDataItemNode.Next;
                    removed       = true;
                }

                UnboundDataItemNode next = unboundDataItemNode.Next;

                if (next != null)
                {
                    next.Previous = unboundDataItemNode.Previous;
                    removed       = true;
                }

                if (removed)
                {
                    unboundDataItemNode.Previous = null;
                    unboundDataItemNode.Next     = null;
                    m_count--;
                }
            }
      public void Remove( UnboundDataItemNode unboundDataItemNode )
      {
        bool removed = false;

        if( this.LastNode == unboundDataItemNode )
        {
          this.LastNode = unboundDataItemNode.Previous;
          removed = true;
        }

        if( this.FirstNode == unboundDataItemNode )
        {
          this.FirstNode = unboundDataItemNode.Next;
          removed = true;
        }

        UnboundDataItemNode previous = unboundDataItemNode.Previous;

        if( previous != null )
        {
          previous.Next = unboundDataItemNode.Next;
          removed = true;
        }

        UnboundDataItemNode next = unboundDataItemNode.Next;

        if( next != null )
        {
          next.Previous = unboundDataItemNode.Previous;
          removed = true;
        }

        if( removed )
        {
          unboundDataItemNode.Previous = null;
          unboundDataItemNode.Next = null;
          m_count--;
        }
      }
      public void Add( UnboundDataItemNode newNode )
      {
        newNode.Next = this.FirstNode;

        if( this.FirstNode != null )
          this.FirstNode.Previous = newNode;

        this.FirstNode = newNode;

        if( this.LastNode == null )
          this.LastNode = this.FirstNode;

        m_count++;
      }