OrderedDictionary.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / xsp / System / Web / Extensions / Util / OrderedDictionary.cs / 1 / OrderedDictionary.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Web.Util { 
    using System; 
    using System.Collections;
    using System.Collections.Generic; 

    internal class OrderedDictionary : IDictionary {
        private Dictionary _dictionary;
        private List _keys; 
        private List _values;
 
        // Cannot easily support ctor that takes IEqualityComparer, since List doesn't have an easy 
        // way to use the IEqualityComparer.
        public OrderedDictionary() 
            : this(0) {
        }

        public OrderedDictionary(int capacity) { 
            _dictionary = new Dictionary(capacity);
            _keys = new List(capacity); 
            _values = new List(capacity); 
        }
 
        public int Count {
            get {
                return _dictionary.Count;
            } 
        }
 
        public ICollection Keys { 
            get {
                return _keys.AsReadOnly(); 
            }
        }

        public TValue this[TKey key] { 
            get {
                return _dictionary[key]; 
            } 
            set {
                // If key has already been added, we must first remove it from the lists so it is not 
                // in the lists multiple times.
                RemoveFromLists(key);

                _dictionary[key] = value; 
                _keys.Add(key);
                _values.Add(value); 
            } 
        }
 
        public ICollection Values {
            get {
                return _values.AsReadOnly();
            } 
        }
 
        public void Add(TKey key, TValue value) { 
            // Dictionary.Add() will throw if it already contains key
            _dictionary.Add(key, value); 
            _keys.Add(key);
            _values.Add(value);
        }
 
        public void Clear() {
            _dictionary.Clear(); 
            _keys.Clear(); 
            _values.Clear();
        } 

        public bool ContainsKey(TKey key) {
            return _dictionary.ContainsKey(key);
        } 

        public bool ContainsValue(TValue value) { 
            return _dictionary.ContainsValue(value); 
        }
 
        public IEnumerator> GetEnumerator() {
            int i = 0;
            // Must use foreach instead of a for loop, since we want the underlying List enumerator to
            // throw an exception if the list is modified during enumeration. 
            foreach (TKey key in _keys) {
                yield return new KeyValuePair(key, _values[i]); 
                i++; 
            }
        } 

        private void RemoveFromLists(TKey key) {
            int index = _keys.IndexOf(key);
            if (index != -1) { 
                _keys.RemoveAt(index);
                _values.RemoveAt(index); 
            } 
        }
 
        public bool Remove(TKey key) {
            RemoveFromLists(key);
            return _dictionary.Remove(key);
        } 

        public bool TryGetValue(TKey key, out TValue value) { 
            return _dictionary.TryGetValue(key, out value); 
        }
 
        #region ICollection> Members
        bool ICollection>.IsReadOnly {
            get {
                return ((ICollection>)_dictionary).IsReadOnly; 
            }
        } 
 
        void ICollection>.Add(KeyValuePair item) {
            Add(item.Key, item.Value); 
        }

        bool ICollection>.Contains(KeyValuePair item) {
            return ((ICollection>)_dictionary).Contains(item); 
        }
 
        void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { 
            ((ICollection>)_dictionary).CopyTo(array, arrayIndex);
        } 

        bool ICollection>.Remove(KeyValuePair item) {
            bool removed = ((ICollection>)_dictionary).Remove(item);
 
            // Only remove from lists if it was removed from the dictionary, since the dictionary may contain
            // the key but not the value. 
            if (removed) { 
                RemoveFromLists(item.Key);
            } 

            return removed;
        }
        #endregion 

        #region IEnumerable Members 
        IEnumerator IEnumerable.GetEnumerator() { 
            return GetEnumerator();
        } 
        #endregion
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Web.Util { 
    using System; 
    using System.Collections;
    using System.Collections.Generic; 

    internal class OrderedDictionary : IDictionary {
        private Dictionary _dictionary;
        private List _keys; 
        private List _values;
 
        // Cannot easily support ctor that takes IEqualityComparer, since List doesn't have an easy 
        // way to use the IEqualityComparer.
        public OrderedDictionary() 
            : this(0) {
        }

        public OrderedDictionary(int capacity) { 
            _dictionary = new Dictionary(capacity);
            _keys = new List(capacity); 
            _values = new List(capacity); 
        }
 
        public int Count {
            get {
                return _dictionary.Count;
            } 
        }
 
        public ICollection Keys { 
            get {
                return _keys.AsReadOnly(); 
            }
        }

        public TValue this[TKey key] { 
            get {
                return _dictionary[key]; 
            } 
            set {
                // If key has already been added, we must first remove it from the lists so it is not 
                // in the lists multiple times.
                RemoveFromLists(key);

                _dictionary[key] = value; 
                _keys.Add(key);
                _values.Add(value); 
            } 
        }
 
        public ICollection Values {
            get {
                return _values.AsReadOnly();
            } 
        }
 
        public void Add(TKey key, TValue value) { 
            // Dictionary.Add() will throw if it already contains key
            _dictionary.Add(key, value); 
            _keys.Add(key);
            _values.Add(value);
        }
 
        public void Clear() {
            _dictionary.Clear(); 
            _keys.Clear(); 
            _values.Clear();
        } 

        public bool ContainsKey(TKey key) {
            return _dictionary.ContainsKey(key);
        } 

        public bool ContainsValue(TValue value) { 
            return _dictionary.ContainsValue(value); 
        }
 
        public IEnumerator> GetEnumerator() {
            int i = 0;
            // Must use foreach instead of a for loop, since we want the underlying List enumerator to
            // throw an exception if the list is modified during enumeration. 
            foreach (TKey key in _keys) {
                yield return new KeyValuePair(key, _values[i]); 
                i++; 
            }
        } 

        private void RemoveFromLists(TKey key) {
            int index = _keys.IndexOf(key);
            if (index != -1) { 
                _keys.RemoveAt(index);
                _values.RemoveAt(index); 
            } 
        }
 
        public bool Remove(TKey key) {
            RemoveFromLists(key);
            return _dictionary.Remove(key);
        } 

        public bool TryGetValue(TKey key, out TValue value) { 
            return _dictionary.TryGetValue(key, out value); 
        }
 
        #region ICollection> Members
        bool ICollection>.IsReadOnly {
            get {
                return ((ICollection>)_dictionary).IsReadOnly; 
            }
        } 
 
        void ICollection>.Add(KeyValuePair item) {
            Add(item.Key, item.Value); 
        }

        bool ICollection>.Contains(KeyValuePair item) {
            return ((ICollection>)_dictionary).Contains(item); 
        }
 
        void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { 
            ((ICollection>)_dictionary).CopyTo(array, arrayIndex);
        } 

        bool ICollection>.Remove(KeyValuePair item) {
            bool removed = ((ICollection>)_dictionary).Remove(item);
 
            // Only remove from lists if it was removed from the dictionary, since the dictionary may contain
            // the key but not the value. 
            if (removed) { 
                RemoveFromLists(item.Key);
            } 

            return removed;
        }
        #endregion 

        #region IEnumerable Members 
        IEnumerator IEnumerable.GetEnumerator() { 
            return GetEnumerator();
        } 
        #endregion
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK