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
- XsltSettings.cs
- MailWriter.cs
- TextServicesCompartmentEventSink.cs
- TypeName.cs
- TripleDES.cs
- ServerTooBusyException.cs
- SqlFunctionAttribute.cs
- DataKey.cs
- Scalars.cs
- ADMembershipProvider.cs
- BoundColumn.cs
- DSACryptoServiceProvider.cs
- EditingCommands.cs
- GcHandle.cs
- InputLangChangeRequestEvent.cs
- EngineSite.cs
- FilteredReadOnlyMetadataCollection.cs
- Rect3D.cs
- AssociativeAggregationOperator.cs
- SqlRowUpdatingEvent.cs
- sqlinternaltransaction.cs
- _LazyAsyncResult.cs
- sqlmetadatafactory.cs
- TraceFilter.cs
- VisualProxy.cs
- WindowsFormsSynchronizationContext.cs
- ASCIIEncoding.cs
- MultiPropertyDescriptorGridEntry.cs
- FileDialogPermission.cs
- TemplateControlBuildProvider.cs
- RandomNumberGenerator.cs
- SqlLiftWhereClauses.cs
- TemplateLookupAction.cs
- EntityDesignerBuildProvider.cs
- XmlSchemaGroup.cs
- WindowsContainer.cs
- MaskedTextBoxDesignerActionList.cs
- SharedStatics.cs
- Helper.cs
- SqlProcedureAttribute.cs
- Convert.cs
- XmlLinkedNode.cs
- SslStreamSecurityUpgradeProvider.cs
- XmlSiteMapProvider.cs
- Quaternion.cs
- MenuBase.cs
- EdmPropertyAttribute.cs
- SettingsSavedEventArgs.cs
- ColumnPropertiesGroup.cs
- FileDialogCustomPlacesCollection.cs
- Pick.cs
- CustomPopupPlacement.cs
- ErrorRuntimeConfig.cs
- TransformPatternIdentifiers.cs
- AutoCompleteStringCollection.cs
- CodeTypeOfExpression.cs
- MarkupCompiler.cs
- ObjectHelper.cs
- ControlIdConverter.cs
- LongTypeConverter.cs
- EmbeddedMailObjectCollectionEditor.cs
- ServicesUtilities.cs
- XmlCharacterData.cs
- FixedHyperLink.cs
- MetadataProperty.cs
- SafeMILHandle.cs
- DefaultValueTypeConverter.cs
- StrongNameIdentityPermission.cs
- AttributeEmitter.cs
- ExclusiveCanonicalizationTransform.cs
- HTMLTextWriter.cs
- Context.cs
- MessageFormatterConverter.cs
- ThreadAbortException.cs
- UIPermission.cs
- ProtectedConfigurationSection.cs
- CommandID.cs
- StringStorage.cs
- PublishLicense.cs
- XmlAnyElementAttribute.cs
- IfJoinedCondition.cs
- ByteStack.cs
- OptionalMessageQuery.cs
- PrimitiveSchema.cs
- FusionWrap.cs
- SecureEnvironment.cs
- Polyline.cs
- FontResourceCache.cs
- AccessViolationException.cs
- PerformanceCounterNameAttribute.cs
- MappingItemCollection.cs
- HttpApplicationStateBase.cs
- BamlStream.cs
- ClipboardProcessor.cs
- UnsafeNativeMethods.cs
- AxDesigner.cs
- CodeDOMUtility.cs
- WebPartConnectionsCloseVerb.cs
- DataListItemEventArgs.cs
- ExclusiveCanonicalizationTransform.cs