Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TabControl.cs
- EntityTypeEmitter.cs
- CommandBinding.cs
- ActiveXHost.cs
- UnmanagedMemoryStream.cs
- InvalidProgramException.cs
- SqlOuterApplyReducer.cs
- DtdParser.cs
- MD5.cs
- Rijndael.cs
- WebPartsPersonalization.cs
- FunctionDescription.cs
- BinaryObjectReader.cs
- QueryOperator.cs
- TimeZone.cs
- GridViewAutomationPeer.cs
- TemplatePagerField.cs
- ScrollBar.cs
- BuildProviderAppliesToAttribute.cs
- ToolStripSplitStackLayout.cs
- WebPartEditorApplyVerb.cs
- StdValidatorsAndConverters.cs
- CompilationUtil.cs
- WebZoneDesigner.cs
- XmlSchemaResource.cs
- HtmlTextArea.cs
- TimersDescriptionAttribute.cs
- Symbol.cs
- FontCollection.cs
- DataObjectCopyingEventArgs.cs
- AudienceUriMode.cs
- UserPreferenceChangingEventArgs.cs
- ExpressionEditorSheet.cs
- processwaithandle.cs
- FieldMetadata.cs
- ProgressBar.cs
- ThemeDirectoryCompiler.cs
- SamlAuthorizationDecisionClaimResource.cs
- ProgressBar.cs
- Perspective.cs
- ProcessThreadCollection.cs
- PropertyNames.cs
- Version.cs
- TimeSpanOrInfiniteValidator.cs
- AmbientValueAttribute.cs
- SoapExtension.cs
- WinFormsSpinner.cs
- CommandPlan.cs
- DataGridViewEditingControlShowingEventArgs.cs
- HistoryEventArgs.cs
- DbConnectionPool.cs
- PageAsyncTask.cs
- XamlFilter.cs
- PolyLineSegment.cs
- COM2EnumConverter.cs
- IdentitySection.cs
- RawMouseInputReport.cs
- Decimal.cs
- SqlCharStream.cs
- ChannelFactory.cs
- RoleService.cs
- GetPageCompletedEventArgs.cs
- DocumentViewerBase.cs
- PrefixHandle.cs
- SizeAnimationBase.cs
- GlyphingCache.cs
- XmlArrayItemAttributes.cs
- BackgroundWorker.cs
- CharEnumerator.cs
- MembershipSection.cs
- TextElementCollectionHelper.cs
- TextSerializer.cs
- BeginStoryboard.cs
- JsonReaderDelegator.cs
- PropertyCondition.cs
- VectorAnimationUsingKeyFrames.cs
- RowSpanVector.cs
- ClientData.cs
- InputLanguageEventArgs.cs
- NetworkInformationPermission.cs
- HttpCacheVaryByContentEncodings.cs
- XmlCountingReader.cs
- SessionStateItemCollection.cs
- WebPartMenuStyle.cs
- SEHException.cs
- METAHEADER.cs
- Catch.cs
- compensatingcollection.cs
- StrongNameIdentityPermission.cs
- PeerNameRecordCollection.cs
- ColorContextHelper.cs
- AttributeCollection.cs
- SqlDataSourceStatusEventArgs.cs
- MediaSystem.cs
- ProcessThread.cs
- FontDialog.cs
- TextClipboardData.cs
- DiscreteKeyFrames.cs
- MailDefinition.cs
- StronglyTypedResourceBuilder.cs