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
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PlacementWorkspace.cs
- AspNetSynchronizationContext.cs
- CompilationPass2Task.cs
- Formatter.cs
- RuleSettings.cs
- TcpAppDomainProtocolHandler.cs
- CalculatedColumn.cs
- DragDrop.cs
- FontStyle.cs
- AutomationInteropProvider.cs
- PageBuildProvider.cs
- SelectionChangedEventArgs.cs
- RegisteredDisposeScript.cs
- HttpHeaderCollection.cs
- Opcode.cs
- PackWebRequestFactory.cs
- HebrewCalendar.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- MexHttpsBindingCollectionElement.cs
- WorkflowCommandExtensionItem.cs
- VirtualPathUtility.cs
- TileModeValidation.cs
- MetadataStore.cs
- _ConnectOverlappedAsyncResult.cs
- FilterEventArgs.cs
- ReservationNotFoundException.cs
- AssemblyResourceLoader.cs
- EntityDataSourceReferenceGroup.cs
- TableItemProviderWrapper.cs
- DataGridViewComboBoxColumn.cs
- SiteMapNodeCollection.cs
- CheckBoxDesigner.cs
- PrtCap_Builder.cs
- EdmRelationshipRoleAttribute.cs
- ProcessHost.cs
- Converter.cs
- HtmlElement.cs
- ApplicationInterop.cs
- Model3DCollection.cs
- _HeaderInfo.cs
- TreeNode.cs
- XmlConvert.cs
- Base64Encoder.cs
- SqlBooleanizer.cs
- MaterialGroup.cs
- EqualityComparer.cs
- TypeConverterValueSerializer.cs
- xmlformatgeneratorstatics.cs
- CodeGroup.cs
- MimeXmlImporter.cs
- FileUtil.cs
- FlowLayoutPanel.cs
- ToolStripDropDownDesigner.cs
- XsdValidatingReader.cs
- XmlCDATASection.cs
- WizardStepCollectionEditor.cs
- SystemEvents.cs
- PEFileEvidenceFactory.cs
- MD5.cs
- Error.cs
- RemoteWebConfigurationHost.cs
- AndCondition.cs
- FunctionDefinition.cs
- WindowsFormsLinkLabel.cs
- mactripleDES.cs
- ConfigXmlElement.cs
- MailWriter.cs
- ItemCollectionEditor.cs
- RootBrowserWindow.cs
- StylusEditingBehavior.cs
- EventPropertyMap.cs
- DictionaryManager.cs
- SerializerProvider.cs
- SemaphoreSecurity.cs
- SmiEventSink.cs
- DataBinding.cs
- EntityParameterCollection.cs
- CodeTryCatchFinallyStatement.cs
- XmlSchemaComplexContentExtension.cs
- MulticastOption.cs
- ObjectCloneHelper.cs
- BinaryWriter.cs
- LocalIdKeyIdentifierClause.cs
- ListViewGroupItemCollection.cs
- UpDownBase.cs
- Track.cs
- LocatorManager.cs
- DtrList.cs
- BamlMapTable.cs
- AnnotationObservableCollection.cs
- JavaScriptSerializer.cs
- RSACryptoServiceProvider.cs
- LOSFormatter.cs
- FreezableCollection.cs
- EntitySetDataBindingList.cs
- DocumentCollection.cs
- SqlServices.cs
- WebResourceAttribute.cs
- TreeSet.cs
- Int16Converter.cs