Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / fx / src / XmlUtils / System / Xml / Xsl / Runtime / StringConcat.cs / 1 / 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
- WebContext.cs
- Rotation3D.cs
- AmbientProperties.cs
- DataPagerField.cs
- PrtCap_Builder.cs
- SendAgentStatusRequest.cs
- XomlDesignerLoader.cs
- ObjectDataProvider.cs
- DebuggerAttributes.cs
- HostedNamedPipeTransportManager.cs
- StoreItemCollection.cs
- ViewGenResults.cs
- CodeLinePragma.cs
- WrappedIUnknown.cs
- NTAccount.cs
- GrammarBuilderBase.cs
- FormatSettings.cs
- QuaternionAnimation.cs
- ProcessInfo.cs
- Decimal.cs
- FacetDescription.cs
- TraceListeners.cs
- ObjectQueryExecutionPlan.cs
- DesignerActionUIService.cs
- WorkflowView.cs
- UpdatableWrapper.cs
- control.ime.cs
- PrimarySelectionGlyph.cs
- MostlySingletonList.cs
- DataGridSortCommandEventArgs.cs
- TrackingAnnotationCollection.cs
- OleDbMetaDataFactory.cs
- ApplyImportsAction.cs
- RotateTransform.cs
- Stopwatch.cs
- HandleRef.cs
- StylusPlugin.cs
- StrongNameSignatureInformation.cs
- HttpFileCollection.cs
- RegexFCD.cs
- SqlStatistics.cs
- MouseGestureConverter.cs
- StorageMappingFragment.cs
- ContentElementAutomationPeer.cs
- TemplateBindingExtensionConverter.cs
- CurrentChangingEventManager.cs
- PointAnimationBase.cs
- RsaSecurityTokenAuthenticator.cs
- QueryCoreOp.cs
- SplineQuaternionKeyFrame.cs
- BasePattern.cs
- XmlSchemas.cs
- EncoderBestFitFallback.cs
- MemoryFailPoint.cs
- XDRSchema.cs
- HostingEnvironment.cs
- ClrProviderManifest.cs
- ServiceProviders.cs
- DesignRelation.cs
- DES.cs
- SendingRequestEventArgs.cs
- WebBodyFormatMessageProperty.cs
- HtmlInputHidden.cs
- OperationCanceledException.cs
- PageTheme.cs
- ReadingWritingEntityEventArgs.cs
- HttpApplicationStateWrapper.cs
- PolicyValidationException.cs
- Opcode.cs
- HyperLink.cs
- HtmlElementErrorEventArgs.cs
- ScriptMethodAttribute.cs
- ComponentDispatcher.cs
- ManifestResourceInfo.cs
- ValidationEventArgs.cs
- SchemaNames.cs
- nulltextnavigator.cs
- XPathDocument.cs
- QueryInterceptorAttribute.cs
- DefaultPrintController.cs
- NoClickablePointException.cs
- GZipUtils.cs
- OutArgument.cs
- RuleSetDialog.Designer.cs
- ConstraintStruct.cs
- SAPIEngineTypes.cs
- DBSqlParserTable.cs
- SqlFlattener.cs
- CharConverter.cs
- SoapTypeAttribute.cs
- _KerberosClient.cs
- Rectangle.cs
- UIElementParaClient.cs
- WebBrowserSiteBase.cs
- DataTableMappingCollection.cs
- SqlClientPermission.cs
- Pair.cs
- PersonalizationDictionary.cs
- TransformConverter.cs
- TripleDESCryptoServiceProvider.cs