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
- ContainerFilterService.cs
- RadioButton.cs
- DateBoldEvent.cs
- TemplateParser.cs
- WebPartMenuStyle.cs
- PathGeometry.cs
- StringUtil.cs
- DetailsViewPageEventArgs.cs
- Variable.cs
- ElementNotAvailableException.cs
- CodeBlockBuilder.cs
- SimpleWorkerRequest.cs
- MultipartContentParser.cs
- EpmAttributeNameBuilder.cs
- StreamInfo.cs
- CssClassPropertyAttribute.cs
- ReceiveSecurityHeaderElementManager.cs
- DbExpressionVisitor_TResultType.cs
- OdbcEnvironment.cs
- SqlDataRecord.cs
- StylusButton.cs
- SqlNode.cs
- StandardOleMarshalObject.cs
- CacheHelper.cs
- GraphicsContainer.cs
- ControlIdConverter.cs
- NetDataContractSerializer.cs
- HtmlLabelAdapter.cs
- RawStylusInputReport.cs
- PathParser.cs
- IISUnsafeMethods.cs
- Regex.cs
- Quad.cs
- WebPartCollection.cs
- WindowsAuthenticationModule.cs
- GenericsNotImplementedException.cs
- TextOnlyOutput.cs
- LineSegment.cs
- IconHelper.cs
- WebZone.cs
- AppendHelper.cs
- TableItemStyle.cs
- DocumentCollection.cs
- XDeferredAxisSource.cs
- UntypedNullExpression.cs
- AccessorTable.cs
- NumberFormatter.cs
- TableLayoutSettingsTypeConverter.cs
- DataColumnCollection.cs
- ToolStripRenderer.cs
- State.cs
- CodeTypeDeclaration.cs
- XsltContext.cs
- PagedDataSource.cs
- PersonalizablePropertyEntry.cs
- TypeElement.cs
- FormViewModeEventArgs.cs
- ReliabilityContractAttribute.cs
- VisualStyleInformation.cs
- StrokeNode.cs
- ToolStripDropDownButton.cs
- HelpProvider.cs
- PageSettings.cs
- EventManager.cs
- ToolStripSystemRenderer.cs
- MDIControlStrip.cs
- ProjectedSlot.cs
- FileClassifier.cs
- HybridDictionary.cs
- CommentEmitter.cs
- ToolStripPanel.cs
- XMLSyntaxException.cs
- PolyLineSegmentFigureLogic.cs
- Condition.cs
- XmlAttributeOverrides.cs
- HuffCodec.cs
- FontNamesConverter.cs
- ReferenceEqualityComparer.cs
- NamespaceCollection.cs
- FloaterBaseParagraph.cs
- EntityDataSourceDesigner.cs
- UserControlDocumentDesigner.cs
- ConfigurationSectionCollection.cs
- CommandValueSerializer.cs
- HtmlTextArea.cs
- StreamInfo.cs
- MD5CryptoServiceProvider.cs
- ToolStripPanelRow.cs
- Tag.cs
- DiagnosticTraceRecords.cs
- MetaTable.cs
- PeerNameResolver.cs
- HttpRuntimeSection.cs
- GridViewCancelEditEventArgs.cs
- AppManager.cs
- FormsAuthenticationUser.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- PrivilegedConfigurationManager.cs
- Ref.cs
- KeyTime.cs