Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Xml / System / Xml / XPath / XPathNodeIterator.cs / 5 / XPathNodeIterator.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.XPath { using System; using System.Collections; using System.Diagnostics; using System.Text; [DebuggerDisplay("Position={CurrentPosition}, Current={debuggerDisplayProxy}")] public abstract class XPathNodeIterator : ICloneable, IEnumerable { internal int count = -1; object ICloneable.Clone() { return this.Clone(); } public abstract XPathNodeIterator Clone(); public abstract bool MoveNext(); public abstract XPathNavigator Current { get; } public abstract int CurrentPosition { get; } public virtual int Count { get { if (count == -1) { XPathNodeIterator clone = this.Clone(); while(clone.MoveNext()) ; count = clone.CurrentPosition; } return count; } } public virtual IEnumerator GetEnumerator() { return new Enumerator(this); } private object debuggerDisplayProxy { get { return Current == null ? null : (object)new XPathNavigator.DebuggerDisplayProxy(Current); } } ////// Implementation of a resetable enumerator that is linked to the XPathNodeIterator used to create it. /// private class Enumerator : IEnumerator { private XPathNodeIterator original; // Keep original XPathNodeIterator in case Reset() is called private XPathNodeIterator current; private bool iterationStarted; public Enumerator(XPathNodeIterator original) { this.original = original.Clone(); } public virtual object Current { get { // 1. Do not reuse the XPathNavigator, as we do in XPathNodeIterator // 2. Throw exception if current position is before first node or after the last node if (this.iterationStarted) { // Current is null if iterator is positioned after the last node if (this.current == null) throw new InvalidOperationException(Res.GetString(Res.Sch_EnumFinished, string.Empty)); return this.current.Current.Clone(); } // User must call MoveNext before accessing Current property throw new InvalidOperationException(Res.GetString(Res.Sch_EnumNotStarted, string.Empty)); } } public virtual bool MoveNext() { // Delegate to XPathNodeIterator if (!this.iterationStarted) { // Reset iteration to original position this.current = this.original.Clone(); this.iterationStarted = true; } if (this.current == null || !this.current.MoveNext()) { // Iteration complete this.current = null; return false; } return true; } public virtual void Reset() { this.iterationStarted = false; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Xml.XPath { using System; using System.Collections; using System.Diagnostics; using System.Text; [DebuggerDisplay("Position={CurrentPosition}, Current={debuggerDisplayProxy}")] public abstract class XPathNodeIterator : ICloneable, IEnumerable { internal int count = -1; object ICloneable.Clone() { return this.Clone(); } public abstract XPathNodeIterator Clone(); public abstract bool MoveNext(); public abstract XPathNavigator Current { get; } public abstract int CurrentPosition { get; } public virtual int Count { get { if (count == -1) { XPathNodeIterator clone = this.Clone(); while(clone.MoveNext()) ; count = clone.CurrentPosition; } return count; } } public virtual IEnumerator GetEnumerator() { return new Enumerator(this); } private object debuggerDisplayProxy { get { return Current == null ? null : (object)new XPathNavigator.DebuggerDisplayProxy(Current); } } ////// Implementation of a resetable enumerator that is linked to the XPathNodeIterator used to create it. /// private class Enumerator : IEnumerator { private XPathNodeIterator original; // Keep original XPathNodeIterator in case Reset() is called private XPathNodeIterator current; private bool iterationStarted; public Enumerator(XPathNodeIterator original) { this.original = original.Clone(); } public virtual object Current { get { // 1. Do not reuse the XPathNavigator, as we do in XPathNodeIterator // 2. Throw exception if current position is before first node or after the last node if (this.iterationStarted) { // Current is null if iterator is positioned after the last node if (this.current == null) throw new InvalidOperationException(Res.GetString(Res.Sch_EnumFinished, string.Empty)); return this.current.Current.Clone(); } // User must call MoveNext before accessing Current property throw new InvalidOperationException(Res.GetString(Res.Sch_EnumNotStarted, string.Empty)); } } public virtual bool MoveNext() { // Delegate to XPathNodeIterator if (!this.iterationStarted) { // Reset iteration to original position this.current = this.original.Clone(); this.iterationStarted = true; } if (this.current == null || !this.current.MoveNext()) { // Iteration complete this.current = null; return false; } return true; } public virtual void Reset() { this.iterationStarted = false; } } } } // 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
- AddInControllerImpl.cs
- CssStyleCollection.cs
- SparseMemoryStream.cs
- BitmapEffect.cs
- login.cs
- TransactionFlowProperty.cs
- CustomTypeDescriptor.cs
- PeerChannelListener.cs
- EditingCommands.cs
- HttpCacheParams.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- TemplateBindingExtension.cs
- LoginName.cs
- RuntimeUtils.cs
- BooleanExpr.cs
- ParseHttpDate.cs
- RequiredAttributeAttribute.cs
- XPathBinder.cs
- NavigatorInvalidBodyAccessException.cs
- ResourceType.cs
- StorageMappingItemCollection.cs
- MostlySingletonList.cs
- BaseValidator.cs
- ColorInterpolationModeValidation.cs
- ClientSettingsSection.cs
- ConstraintManager.cs
- VideoDrawing.cs
- TextHidden.cs
- CompositeControl.cs
- BrowserDefinition.cs
- WebHeaderCollection.cs
- Run.cs
- DesignerProperties.cs
- SystemResources.cs
- COM2ExtendedTypeConverter.cs
- Ipv6Element.cs
- LinqDataSourceSelectEventArgs.cs
- TimeIntervalCollection.cs
- TableItemPattern.cs
- WCFModelStrings.Designer.cs
- DocumentReference.cs
- CodeMemberEvent.cs
- CodeEntryPointMethod.cs
- CodeGenerator.cs
- MostlySingletonList.cs
- MessageDecoder.cs
- XmlReaderDelegator.cs
- AdRotator.cs
- AuthorizationSection.cs
- RecommendedAsConfigurableAttribute.cs
- TextWriter.cs
- ListItem.cs
- TraceLog.cs
- PasswordTextContainer.cs
- shaperfactoryquerycachekey.cs
- CompressedStack.cs
- ColorKeyFrameCollection.cs
- EntityAdapter.cs
- CharacterMetrics.cs
- Stroke.cs
- SharedPersonalizationStateInfo.cs
- JoinElimination.cs
- TextReader.cs
- TCEAdapterGenerator.cs
- XsltCompileContext.cs
- SqlConnectionStringBuilder.cs
- ConnectionModeReader.cs
- ProviderConnectionPointCollection.cs
- MatrixTransform.cs
- DocumentViewerBase.cs
- IndentedWriter.cs
- Int32CollectionConverter.cs
- EntityDataSourceMemberPath.cs
- ColumnMapProcessor.cs
- shaperfactoryquerycachekey.cs
- Activator.cs
- TrackingExtract.cs
- BaseCodeDomTreeGenerator.cs
- ExtensionSimplifierMarkupObject.cs
- VerificationAttribute.cs
- EqualityComparer.cs
- SingleSelectRootGridEntry.cs
- Span.cs
- ObjectDataSourceDisposingEventArgs.cs
- QuotedPrintableStream.cs
- ObjectTag.cs
- ResourceProviderFactory.cs
- SiteMapDataSource.cs
- ScriptingRoleServiceSection.cs
- EventToken.cs
- BoundColumn.cs
- _ListenerResponseStream.cs
- CodeExporter.cs
- XmlSerializerVersionAttribute.cs
- InputBuffer.cs
- CalendarDay.cs
- MethodRental.cs
- CornerRadiusConverter.cs
- MissingMemberException.cs
- AuthenticationModuleElementCollection.cs