Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Collections / ObjectModel / KeyedCollection.cs / 1305376 / KeyedCollection.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
// [....]
//
namespace System.Collections.ObjectModel
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.Contracts;
[Serializable]
[System.Runtime.InteropServices.ComVisible(false)]
[DebuggerTypeProxy(typeof(Mscorlib_KeyedCollectionDebugView<,>))]
[DebuggerDisplay("Count = {Count}")]
public abstract class KeyedCollection: Collection
{
const int defaultThreshold = 0;
IEqualityComparer comparer;
Dictionary dict;
int keyCount;
int threshold;
protected KeyedCollection(): this(null, defaultThreshold) {}
protected KeyedCollection(IEqualityComparer comparer): this(comparer, defaultThreshold) {}
protected KeyedCollection(IEqualityComparer comparer, int dictionaryCreationThreshold) {
if (comparer == null) {
comparer = EqualityComparer.Default;
}
if (dictionaryCreationThreshold == -1) {
dictionaryCreationThreshold = int.MaxValue;
}
if( dictionaryCreationThreshold < -1) {
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.dictionaryCreationThreshold, ExceptionResource.ArgumentOutOfRange_InvalidThreshold);
}
this.comparer = comparer;
this.threshold = dictionaryCreationThreshold;
}
public IEqualityComparer Comparer {
get {
return comparer;
}
}
public TItem this[TKey key] {
get {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (dict != null) {
return dict[key];
}
foreach (TItem item in Items) {
if (comparer.Equals(GetKeyForItem(item), key)) return item;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TItem);
}
}
public bool Contains(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (dict != null) {
return dict.ContainsKey(key);
}
if (key != null) {
foreach (TItem item in Items) {
if (comparer.Equals(GetKeyForItem(item), key)) return true;
}
}
return false;
}
private bool ContainsItem(TItem item) {
TKey key;
if( (dict == null) || ((key = GetKeyForItem(item)) == null)) {
return Items.Contains(item);
}
TItem itemInDict;
bool exist = dict.TryGetValue(key, out itemInDict);
if( exist) {
return EqualityComparer.Default.Equals(itemInDict, item);
}
return false;
}
public bool Remove(TKey key) {
if( key == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (dict != null) {
if (dict.ContainsKey(key)) {
return Remove(dict[key]);
}
return false;
}
if (key != null) {
for (int i = 0; i < Items.Count; i++) {
if (comparer.Equals(GetKeyForItem(Items[i]), key)) {
RemoveItem(i);
return true;
}
}
}
return false;
}
protected IDictionary Dictionary {
get { return dict; }
}
protected void ChangeItemKey(TItem item, TKey newKey) {
// check if the item exists in the collection
if( !ContainsItem(item)) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_ItemNotExist);
}
TKey oldKey = GetKeyForItem(item);
if (!comparer.Equals(oldKey, newKey)) {
if (newKey != null) {
AddKey(newKey, item);
}
if (oldKey != null) {
RemoveKey(oldKey);
}
}
}
protected override void ClearItems() {
base.ClearItems();
if (dict != null) {
dict.Clear();
}
keyCount = 0;
}
protected abstract TKey GetKeyForItem(TItem item);
protected override void InsertItem(int index, TItem item) {
TKey key = GetKeyForItem(item);
if (key != null) {
AddKey(key, item);
}
base.InsertItem(index, item);
}
protected override void RemoveItem(int index) {
TKey key = GetKeyForItem(Items[index]);
if (key != null) {
RemoveKey(key);
}
base.RemoveItem(index);
}
protected override void SetItem(int index, TItem item) {
TKey newKey = GetKeyForItem(item);
TKey oldKey = GetKeyForItem(Items[index]);
if (comparer.Equals(oldKey, newKey)) {
if (newKey != null && dict != null) {
dict[newKey] = item;
}
}
else {
if (newKey != null) {
AddKey(newKey, item);
}
if (oldKey != null) {
RemoveKey(oldKey);
}
}
base.SetItem(index, item);
}
private void AddKey(TKey key, TItem item) {
if (dict != null) {
dict.Add(key, item);
}
else if (keyCount == threshold) {
CreateDictionary();
dict.Add(key, item);
}
else {
if (Contains(key)) {
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
keyCount++;
}
}
private void CreateDictionary() {
dict = new Dictionary(comparer);
foreach (TItem item in Items) {
TKey key = GetKeyForItem(item);
if (key != null) {
dict.Add(key, item);
}
}
}
private void RemoveKey(TKey key) {
Contract.Assert(key != null, "key shouldn't be null!");
if (dict != null) {
dict.Remove(key);
}
else {
keyCount--;
}
}
}
}
// 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
- TriState.cs
- TableRowGroup.cs
- XmlSerializationReader.cs
- DataStreams.cs
- ResourceManagerWrapper.cs
- EllipseGeometry.cs
- Composition.cs
- SecurityKeyIdentifier.cs
- SystemUdpStatistics.cs
- FtpWebRequest.cs
- Rect.cs
- ViewStateModeByIdAttribute.cs
- PointConverter.cs
- ComboBoxRenderer.cs
- Profiler.cs
- Identity.cs
- SqlGenerator.cs
- IriParsingElement.cs
- StrokeRenderer.cs
- CustomAttributeFormatException.cs
- SqlHelper.cs
- QuotedPrintableStream.cs
- PersonalizationStateInfoCollection.cs
- LightweightCodeGenerator.cs
- DependentList.cs
- SqlXmlStorage.cs
- DataServiceEntityAttribute.cs
- XmlSchemaValidationException.cs
- BrowserDefinition.cs
- WebPartDescriptionCollection.cs
- IisTraceWebEventProvider.cs
- SharedDp.cs
- HtmlTable.cs
- HttpRequestTraceRecord.cs
- DataSourceViewSchemaConverter.cs
- MSAANativeProvider.cs
- LogicalExpr.cs
- SrgsSubset.cs
- QilIterator.cs
- QuaternionRotation3D.cs
- XmlnsCache.cs
- COM2ColorConverter.cs
- PerspectiveCamera.cs
- PerformanceCounterNameAttribute.cs
- TdsParserSafeHandles.cs
- ComponentCommands.cs
- WeakEventTable.cs
- RangeContentEnumerator.cs
- EnumerableCollectionView.cs
- FtpCachePolicyElement.cs
- RuleSettings.cs
- ClientScriptItemCollection.cs
- EndGetFileNameFromUserRequest.cs
- mactripleDES.cs
- TableColumnCollectionInternal.cs
- WmlPanelAdapter.cs
- DbProviderFactory.cs
- Int16Animation.cs
- SqlDataSource.cs
- Timer.cs
- ZipIOCentralDirectoryFileHeader.cs
- DotNetATv1WindowsLogEntryDeserializer.cs
- _SingleItemRequestCache.cs
- MenuEventArgs.cs
- OutputCacheProfile.cs
- CurrencyManager.cs
- HtmlEmptyTagControlBuilder.cs
- AuthenticationModuleElementCollection.cs
- SslStreamSecurityUpgradeProvider.cs
- SmiEventSink.cs
- WindowsTooltip.cs
- CodeGen.cs
- XmlAttribute.cs
- HealthMonitoringSectionHelper.cs
- TextLineResult.cs
- ValidationRule.cs
- WaveHeader.cs
- EmbeddedMailObject.cs
- DmlSqlGenerator.cs
- GradientBrush.cs
- TextBoxView.cs
- XDRSchema.cs
- RunInstallerAttribute.cs
- TiffBitmapDecoder.cs
- NamespaceMapping.cs
- CollectionsUtil.cs
- documentsequencetextview.cs
- LicenseManager.cs
- ProtocolsConfigurationEntry.cs
- InlineUIContainer.cs
- Timer.cs
- Pair.cs
- DirtyTextRange.cs
- ServicePointManagerElement.cs
- ContentOperations.cs
- StorageInfo.cs
- PropertyTabAttribute.cs
- Container.cs
- CheckoutException.cs
- DocumentOrderQuery.cs