Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / Extensions / Util / OrderedDictionary.cs / 1305376 / 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
- FileEnumerator.cs
- WindowShowOrOpenTracker.cs
- XmlSchemaInclude.cs
- ServiceManager.cs
- DtdParser.cs
- BamlResourceContent.cs
- ProcessInputEventArgs.cs
- WSHttpBindingBaseElement.cs
- UIntPtr.cs
- ToolStripSettings.cs
- ProxyHelper.cs
- TableCellAutomationPeer.cs
- EventArgs.cs
- DataGridViewTextBoxCell.cs
- ExeContext.cs
- Pens.cs
- SoapBinding.cs
- KeyFrames.cs
- _DomainName.cs
- WindowsGraphicsCacheManager.cs
- CompatibleIComparer.cs
- TableLayoutRowStyleCollection.cs
- FontNamesConverter.cs
- HtmlControlAdapter.cs
- BitmapFrameEncode.cs
- Brush.cs
- FlowLayoutSettings.cs
- ReachIDocumentPaginatorSerializerAsync.cs
- QuaternionValueSerializer.cs
- OperationParameterInfo.cs
- Matrix3D.cs
- TransformValueSerializer.cs
- IODescriptionAttribute.cs
- DBSqlParser.cs
- RelatedPropertyManager.cs
- RequestResizeEvent.cs
- HierarchicalDataBoundControlAdapter.cs
- DataView.cs
- Module.cs
- SqlProviderManifest.cs
- ToolStripOverflowButton.cs
- httpserverutility.cs
- XmlFormatWriterGenerator.cs
- BinaryConverter.cs
- TransactionFlowBindingElementImporter.cs
- TextMessageEncodingBindingElement.cs
- sitestring.cs
- DataList.cs
- IgnoreFileBuildProvider.cs
- LiteralSubsegment.cs
- DistributedTransactionPermission.cs
- Utils.cs
- ComplexType.cs
- ReferencedAssembly.cs
- DesignerDataConnection.cs
- RegexParser.cs
- PolyQuadraticBezierSegment.cs
- WebPartRestoreVerb.cs
- FixedSOMPageConstructor.cs
- AuthenticationService.cs
- CheckBoxField.cs
- SqlUtils.cs
- hresults.cs
- HostingPreferredMapPath.cs
- ZipIOExtraFieldZip64Element.cs
- TextRunCache.cs
- messageonlyhwndwrapper.cs
- ToolStripButton.cs
- TreeView.cs
- TreeNodeStyleCollection.cs
- WindowsScrollBarBits.cs
- DependencyObjectPropertyDescriptor.cs
- SoundPlayer.cs
- PageCache.cs
- ModelVisual3D.cs
- FlagsAttribute.cs
- _CookieModule.cs
- MetadataCacheItem.cs
- shaper.cs
- AttachInfo.cs
- _ShellExpression.cs
- GetWinFXPath.cs
- Int32KeyFrameCollection.cs
- WSTrustFeb2005.cs
- CharAnimationBase.cs
- UdpDiscoveryMessageFilter.cs
- TypeBuilderInstantiation.cs
- _ConnectionGroup.cs
- SpotLight.cs
- AnonymousIdentificationSection.cs
- OleDbCommandBuilder.cs
- AsymmetricKeyExchangeFormatter.cs
- Security.cs
- GenericAuthenticationEventArgs.cs
- AtlasWeb.Designer.cs
- WebPartTransformerAttribute.cs
- ProfileEventArgs.cs
- DbProviderServices.cs
- NamedPipeAppDomainProtocolHandler.cs
- CharAnimationUsingKeyFrames.cs