Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / Runtime / StringConcat.cs / 1305376 / 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
- Transform3DGroup.cs
- BitmapMetadata.cs
- _ChunkParse.cs
- InvalidAsynchronousStateException.cs
- ScheduleChanges.cs
- StorageModelBuildProvider.cs
- CodeAttributeArgumentCollection.cs
- AsyncResult.cs
- BlurEffect.cs
- SwitchAttribute.cs
- InputDevice.cs
- WebPartZone.cs
- ResourceDefaultValueAttribute.cs
- HtmlInputText.cs
- CodeEntryPointMethod.cs
- Point.cs
- DateBoldEvent.cs
- TypeSource.cs
- keycontainerpermission.cs
- AssemblySettingAttributes.cs
- NewArrayExpression.cs
- SecurityKeyIdentifier.cs
- XmlSchemaSimpleContent.cs
- UnconditionalPolicy.cs
- BitStack.cs
- TextWriter.cs
- MailDefinition.cs
- Hyperlink.cs
- JsonXmlDataContract.cs
- ProgressBar.cs
- RemotingException.cs
- NetStream.cs
- DirectoryObjectSecurity.cs
- NameObjectCollectionBase.cs
- PermissionToken.cs
- SystemWebExtensionsSectionGroup.cs
- DependencyObjectType.cs
- SpecularMaterial.cs
- MeshGeometry3D.cs
- OleDbConnectionInternal.cs
- DataGridViewCellStyle.cs
- Dispatcher.cs
- XPathDocumentBuilder.cs
- SiteMapHierarchicalDataSourceView.cs
- PeerCollaboration.cs
- FusionWrap.cs
- CommandDevice.cs
- BrushProxy.cs
- BrowserCapabilitiesCodeGenerator.cs
- _ProxyRegBlob.cs
- _ConnectionGroup.cs
- IPEndPointCollection.cs
- InfoCardCryptoHelper.cs
- UIAgentAsyncBeginRequest.cs
- SelectorAutomationPeer.cs
- sqlinternaltransaction.cs
- CatalogZoneBase.cs
- MultilineStringConverter.cs
- MappingModelBuildProvider.cs
- ActivityWithResultWrapper.cs
- SerTrace.cs
- AssemblyBuilder.cs
- InvalidOleVariantTypeException.cs
- SortedList.cs
- HttpRawResponse.cs
- UnhandledExceptionEventArgs.cs
- MimeMapping.cs
- PasswordRecovery.cs
- AttributeUsageAttribute.cs
- MemberAccessException.cs
- Solver.cs
- RegisteredScript.cs
- FontStyleConverter.cs
- BitmapEffectInput.cs
- DropTarget.cs
- ValidationRuleCollection.cs
- RepeaterDesigner.cs
- ExpressionParser.cs
- ReflectionHelper.cs
- WorkflowInlining.cs
- Polyline.cs
- ZoneButton.cs
- RowsCopiedEventArgs.cs
- ModelPropertyCollectionImpl.cs
- WinFormsSpinner.cs
- WebPartEventArgs.cs
- ZipIOModeEnforcingStream.cs
- ListViewCommandEventArgs.cs
- ArrowControl.xaml.cs
- XsltInput.cs
- EventDescriptor.cs
- FormView.cs
- SymDocumentType.cs
- LOSFormatter.cs
- ZipIOExtraField.cs
- OrderByLifter.cs
- XPathSelectionIterator.cs
- XmlHierarchicalEnumerable.cs
- DrawingGroup.cs
- ImageInfo.cs