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
- ProfileService.cs
- LinkedResource.cs
- TreeWalker.cs
- InstalledVoice.cs
- ServerValidateEventArgs.cs
- WebServiceEnumData.cs
- Animatable.cs
- TypeConverter.cs
- ResXBuildProvider.cs
- HtmlLink.cs
- SqlDataSourceAdvancedOptionsForm.cs
- EmbeddedMailObjectsCollection.cs
- EncodingDataItem.cs
- CodeBlockBuilder.cs
- DataControlFieldHeaderCell.cs
- iisPickupDirectory.cs
- MailWebEventProvider.cs
- EdmSchemaAttribute.cs
- ImageBrush.cs
- DynamicValueConverter.cs
- FillRuleValidation.cs
- XamlFilter.cs
- JoinTreeSlot.cs
- DataColumn.cs
- FilterEventArgs.cs
- ControlPropertyNameConverter.cs
- AddInAttribute.cs
- RegistrySecurity.cs
- DelayedRegex.cs
- EntityAdapter.cs
- RegexCharClass.cs
- ScalarConstant.cs
- ConnectionsZone.cs
- InputReport.cs
- HttpServerChannel.cs
- XmlSchemaException.cs
- Merger.cs
- ExpressionUtilities.cs
- GetImportFileNameRequest.cs
- SelectionGlyphBase.cs
- ZoomPercentageConverter.cs
- CollectionBase.cs
- returneventsaver.cs
- OledbConnectionStringbuilder.cs
- DataGridViewCellValueEventArgs.cs
- Freezable.cs
- BitmapEncoder.cs
- DbConnectionInternal.cs
- SqlVersion.cs
- DatagridviewDisplayedBandsData.cs
- SourceFileInfo.cs
- ExtenderProvidedPropertyAttribute.cs
- ActivityDesignerResources.cs
- UIElement.cs
- CodeChecksumPragma.cs
- Rotation3DAnimationBase.cs
- MD5Cng.cs
- TitleStyle.cs
- EmptyEnumerable.cs
- LinqDataSourceInsertEventArgs.cs
- ProgressChangedEventArgs.cs
- SessionSwitchEventArgs.cs
- PriorityQueue.cs
- Win32.cs
- ContentOperations.cs
- BezierSegment.cs
- AtomParser.cs
- QilIterator.cs
- ContentControl.cs
- StreamResourceInfo.cs
- InfocardExtendedInformationCollection.cs
- DoubleAnimation.cs
- DomainConstraint.cs
- MessageQueueCriteria.cs
- SqlProfileProvider.cs
- TemplateBuilder.cs
- DataSourceView.cs
- OneToOneMappingSerializer.cs
- HandlerWithFactory.cs
- ProcessHost.cs
- DecimalKeyFrameCollection.cs
- PriorityChain.cs
- PrintEvent.cs
- ContentDisposition.cs
- SvcFileManager.cs
- TargetControlTypeCache.cs
- ComplexPropertyEntry.cs
- AuthStoreRoleProvider.cs
- DocumentCollection.cs
- SocketAddress.cs
- WorkflowDesignerMessageFilter.cs
- DataBinding.cs
- GridEntry.cs
- PointUtil.cs
- DependencyObjectType.cs
- RadioButtonList.cs
- RangeValuePattern.cs
- ProjectionRewriter.cs
- RelationshipSet.cs
- SiteMembershipCondition.cs