Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / XmlUtils / System / Xml / Xsl / Runtime / StringConcat.cs / 2 / StringConcat.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
namespace System.Xml.Xsl.Runtime {
///
/// Efficiently concatenates strings when the number of string is not known beforehand, and
/// yet it is common for only one string to be concatenated. StringBuilder is not good for
/// this purpose, since it *always* allocates objects, even if only one string is appended.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public struct StringConcat {
private string s1, s2, s3, s4;
private string delimiter;
private List strList;
int idxStr;
///
/// Clear the result string.
///
public void Clear() {
this.idxStr = 0;
this.delimiter = null;
}
///
/// Gets or sets the string that delimits concatenated strings.
///
public string Delimiter {
get { return this.delimiter; }
set { this.delimiter = value; }
}
///
/// Return the number of concatenated strings, including delimiters.
///
internal int Count {
get { return this.idxStr; }
}
///
/// Concatenate a new string to the result.
///
public void Concat(string value) {
Debug.Assert(value != null);
if (this.delimiter != null && this.idxStr != 0) {
// Add delimiter
ConcatNoDelimiter(this.delimiter);
}
ConcatNoDelimiter(value);
}
///
/// Get the result string.
///
public string GetResult() {
switch (this.idxStr) {
case 0: return string.Empty;
case 1: return this.s1;
case 2: return string.Concat(this.s1, this.s2);
case 3: return string.Concat(this.s1, this.s2, this.s3);
case 4: return string.Concat(this.s1, this.s2, this.s3, this.s4);
}
return string.Concat(this.strList.ToArray());
}
///
/// Concatenate a new string to the result without adding a delimiter.
///
internal void ConcatNoDelimiter(string s) {
switch (this.idxStr) {
case 0: this.s1 = s; break;
case 1: this.s2 = s; break;
case 2: this.s3 = s; break;
case 3: this.s4 = s; break;
case 4:
// Calling Clear() is expensive, allocate a new List instead
int capacity = (this.strList == null) ? 8 : this.strList.Count;
List strList = this.strList = new List(capacity);
strList.Add(this.s1);
strList.Add(this.s2);
strList.Add(this.s3);
strList.Add(this.s4);
goto default;
default:
this.strList.Add(s);
break;
}
this.idxStr++;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel;
namespace System.Xml.Xsl.Runtime {
///
/// Efficiently concatenates strings when the number of string is not known beforehand, and
/// yet it is common for only one string to be concatenated. StringBuilder is not good for
/// this purpose, since it *always* allocates objects, even if only one string is appended.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public struct StringConcat {
private string s1, s2, s3, s4;
private string delimiter;
private List strList;
int idxStr;
///
/// Clear the result string.
///
public void Clear() {
this.idxStr = 0;
this.delimiter = null;
}
///
/// Gets or sets the string that delimits concatenated strings.
///
public string Delimiter {
get { return this.delimiter; }
set { this.delimiter = value; }
}
///
/// Return the number of concatenated strings, including delimiters.
///
internal int Count {
get { return this.idxStr; }
}
///
/// Concatenate a new string to the result.
///
public void Concat(string value) {
Debug.Assert(value != null);
if (this.delimiter != null && this.idxStr != 0) {
// Add delimiter
ConcatNoDelimiter(this.delimiter);
}
ConcatNoDelimiter(value);
}
///
/// Get the result string.
///
public string GetResult() {
switch (this.idxStr) {
case 0: return string.Empty;
case 1: return this.s1;
case 2: return string.Concat(this.s1, this.s2);
case 3: return string.Concat(this.s1, this.s2, this.s3);
case 4: return string.Concat(this.s1, this.s2, this.s3, this.s4);
}
return string.Concat(this.strList.ToArray());
}
///
/// Concatenate a new string to the result without adding a delimiter.
///
internal void ConcatNoDelimiter(string s) {
switch (this.idxStr) {
case 0: this.s1 = s; break;
case 1: this.s2 = s; break;
case 2: this.s3 = s; break;
case 3: this.s4 = s; break;
case 4:
// Calling Clear() is expensive, allocate a new List instead
int capacity = (this.strList == null) ? 8 : this.strList.Count;
List strList = this.strList = new List(capacity);
strList.Add(this.s1);
strList.Add(this.s2);
strList.Add(this.s3);
strList.Add(this.s4);
goto default;
default:
this.strList.Add(s);
break;
}
this.idxStr++;
}
}
}
// 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
- TableStyle.cs
- ScaleTransform.cs
- _NativeSSPI.cs
- RootBrowserWindowAutomationPeer.cs
- DecimalStorage.cs
- userdatakeys.cs
- CompositeDispatchFormatter.cs
- ToggleButton.cs
- ModuleElement.cs
- UserControlBuildProvider.cs
- ProtocolsConfigurationEntry.cs
- MembershipUser.cs
- SingleAnimationUsingKeyFrames.cs
- WebExceptionStatus.cs
- UnknownBitmapDecoder.cs
- FormatterServicesNoSerializableCheck.cs
- X509AsymmetricSecurityKey.cs
- HttpBrowserCapabilitiesWrapper.cs
- EncryptedXml.cs
- ZoomComboBox.cs
- SecurityPolicySection.cs
- RegexParser.cs
- QueryInterceptorAttribute.cs
- SystemGatewayIPAddressInformation.cs
- Switch.cs
- HttpRuntimeSection.cs
- TemplateControlCodeDomTreeGenerator.cs
- ListBindingConverter.cs
- _CommandStream.cs
- StylusPointPropertyId.cs
- PageRanges.cs
- SqlClientWrapperSmiStreamChars.cs
- RepeatButton.cs
- StrongNameMembershipCondition.cs
- TreeNodeEventArgs.cs
- MiniLockedBorderGlyph.cs
- ValidationEventArgs.cs
- SqlTypeConverter.cs
- SocketException.cs
- Panel.cs
- StaticExtension.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- SpecialFolderEnumConverter.cs
- DatatypeImplementation.cs
- Int32CAMarshaler.cs
- OneToOneMappingSerializer.cs
- EntityCommandCompilationException.cs
- PersonalizablePropertyEntry.cs
- ToolBarButtonClickEvent.cs
- StructuralComparisons.cs
- IndexerNameAttribute.cs
- OleDbRowUpdatedEvent.cs
- IPeerNeighbor.cs
- IPHostEntry.cs
- CodeTypeReferenceCollection.cs
- TableItemStyle.cs
- DataContractSerializerOperationGenerator.cs
- __Filters.cs
- IPGlobalProperties.cs
- TypeConverterAttribute.cs
- FlowDocumentReaderAutomationPeer.cs
- HostSecurityManager.cs
- HttpAsyncResult.cs
- CompressStream.cs
- ReachDocumentReferenceCollectionSerializerAsync.cs
- Interfaces.cs
- DependencyPropertyKind.cs
- MobileControlBuilder.cs
- CqlWriter.cs
- EventToken.cs
- DesignerSerializerAttribute.cs
- panel.cs
- contentDescriptor.cs
- HybridDictionary.cs
- PropertyTabAttribute.cs
- ContextMenuStrip.cs
- ErrorHandler.cs
- DataSourceControl.cs
- HandleTable.cs
- BoundField.cs
- ActivityDesignerAccessibleObject.cs
- VersionedStreamOwner.cs
- recordstatefactory.cs
- Serializer.cs
- RulePatternOps.cs
- QuaternionKeyFrameCollection.cs
- RegionData.cs
- Animatable.cs
- UnmanagedHandle.cs
- ModuleElement.cs
- UInt16.cs
- ProviderSettingsCollection.cs
- RefreshEventArgs.cs
- XmlWellformedWriter.cs
- DescendantQuery.cs
- ExpressionBuilderContext.cs
- Transform3DCollection.cs
- NewItemsContextMenuStrip.cs
- SystemInformation.cs
- AnnotationDocumentPaginator.cs