Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / HybridCollection.cs / 1305376 / HybridCollection.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities { using System; using System.Runtime.Serialization; using System.Collections.Generic; using System.Runtime; using System.Collections.ObjectModel; // used internally for performance in cases where a common usage pattern is a single item [DataContract] class HybridCollectionwhere T : class { [DataMember(EmitDefaultValue = false)] List multipleItems; [DataMember(EmitDefaultValue = false)] T singleItem; public HybridCollection() { } public HybridCollection(T initialItem) { Fx.Assert(initialItem != null, "null is used as a sentinal value and is not a valid item value for a hybrid collection"); this.singleItem = initialItem; } public T this[int index] { get { if (this.singleItem != null) { Fx.Assert(index == 0, "Out of range with a single item"); return this.singleItem; } else if (this.multipleItems != null) { Fx.Assert(index >= 0 && index < this.multipleItems.Count, "Out of range with multiple items."); return this.multipleItems[index]; } Fx.Assert("Out of range. There were no items in the HybridCollection."); return default(T); } } public int Count { get { if (this.singleItem != null) { return 1; } if (this.multipleItems != null) { return this.multipleItems.Count; } return 0; } } protected T SingleItem { get { return this.singleItem; } } protected IList MultipleItems { get { return this.multipleItems; } } public void Add(T item) { Fx.Assert(item != null, "null is used as a sentinal value and is not a valid item value for a hybrid collection"); if (this.multipleItems != null) { this.multipleItems.Add(item); } else if (this.singleItem != null) { this.multipleItems = new List (2); this.multipleItems.Add(this.singleItem); this.multipleItems.Add(item); this.singleItem = null; } else { this.singleItem = item; } } public ReadOnlyCollection AsReadOnly() { if (this.multipleItems != null) { return new ReadOnlyCollection (this.multipleItems); } else if (this.singleItem != null) { return new ReadOnlyCollection (new T[1] { this.singleItem }); } else { return new ReadOnlyCollection (new T[0]); } } // generally used for serialization purposes public void Compress() { if (this.multipleItems != null && this.multipleItems.Count == 1) { this.singleItem = this.multipleItems[0]; this.multipleItems = null; } } public void Remove(T item) { Remove(item, false); } internal void Remove(T item, bool searchingFromEnd) { if (this.singleItem != null) { Fx.Assert(object.Equals(item, this.singleItem), "The given item should be in this list. Something is wrong in our housekeeping."); this.singleItem = null; } else { Fx.Assert(this.multipleItems != null && this.multipleItems.Contains(item), "The given item should be in this list. Something is wrong in our housekeeping."); int position = (searchingFromEnd) ? this.multipleItems.LastIndexOf(item) : this.multipleItems.IndexOf(item); if (position != -1) { this.multipleItems.RemoveAt(position); } } } } } // 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
- CompilerHelpers.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- RelationshipSet.cs
- ReadOnlyCollection.cs
- DelimitedListTraceListener.cs
- CodeNamespaceCollection.cs
- RadioButton.cs
- MediaScriptCommandRoutedEventArgs.cs
- WindowsClientCredential.cs
- SliderAutomationPeer.cs
- ZipIOLocalFileHeader.cs
- DATA_BLOB.cs
- IdentityReference.cs
- CommandManager.cs
- XmlDocumentFieldSchema.cs
- ProcessProtocolHandler.cs
- CodeMethodInvokeExpression.cs
- BasicHttpSecurity.cs
- Point4DConverter.cs
- Activation.cs
- ParserHooks.cs
- DataGridHeaderBorder.cs
- EdmError.cs
- DataBinder.cs
- DiscoveryEndpoint.cs
- TrackingStringDictionary.cs
- ScaleTransform3D.cs
- CallbackValidatorAttribute.cs
- VisualBrush.cs
- RepeatButtonAutomationPeer.cs
- NetworkInformationPermission.cs
- ChannelEndpointElementCollection.cs
- CharacterBuffer.cs
- ObjectQuery.cs
- DataReceivedEventArgs.cs
- IWorkflowDebuggerService.cs
- SQLGuid.cs
- ScriptManagerProxy.cs
- HttpsTransportBindingElement.cs
- AsyncCompletedEventArgs.cs
- BlobPersonalizationState.cs
- XpsResourcePolicy.cs
- FormDesigner.cs
- CryptoKeySecurity.cs
- RegexNode.cs
- ContentControl.cs
- ThreadLocal.cs
- InkSerializer.cs
- WinHttpWebProxyFinder.cs
- OperationCanceledException.cs
- util.cs
- AnimationLayer.cs
- AttachedPropertyBrowsableForTypeAttribute.cs
- TextEditorDragDrop.cs
- ControlType.cs
- AnnotationHelper.cs
- JsonFormatWriterGenerator.cs
- ListViewEditEventArgs.cs
- TextClipboardData.cs
- TreeNodeSelectionProcessor.cs
- _NTAuthentication.cs
- TextLine.cs
- InputLanguageProfileNotifySink.cs
- HttpListenerRequest.cs
- UrlMappingsSection.cs
- HealthMonitoringSection.cs
- HostSecurityManager.cs
- NameSpaceExtractor.cs
- OverlappedAsyncResult.cs
- LineVisual.cs
- IInstanceTable.cs
- RotateTransform3D.cs
- WebPartEditorCancelVerb.cs
- DashStyle.cs
- WebConvert.cs
- InvalidOperationException.cs
- InvalidCommandTreeException.cs
- DropDownList.cs
- RepeaterCommandEventArgs.cs
- SocketInformation.cs
- ElementFactory.cs
- validationstate.cs
- BinarySerializer.cs
- NotifyIcon.cs
- TargetConverter.cs
- NTAccount.cs
- DataGridItemAttachedStorage.cs
- InvalidCastException.cs
- ConfigurationConverterBase.cs
- EventArgs.cs
- XomlSerializationHelpers.cs
- EntityDataSourceState.cs
- TextMarkerSource.cs
- StringAnimationBase.cs
- ConnectionManagementElementCollection.cs
- PersonalizationState.cs
- ArithmeticException.cs
- TreeNodeStyleCollection.cs
- Convert.cs
- InputDevice.cs