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
- WinEventTracker.cs
- TextEditorDragDrop.cs
- IteratorFilter.cs
- SHA1Managed.cs
- HuffCodec.cs
- SynchronizedPool.cs
- DynamicDataExtensions.cs
- URL.cs
- EventsTab.cs
- DefaultPropertyAttribute.cs
- FontWeightConverter.cs
- XDRSchema.cs
- RegexRunnerFactory.cs
- DetailsViewDeletedEventArgs.cs
- MenuRenderer.cs
- SecurityUniqueId.cs
- CharAnimationUsingKeyFrames.cs
- Rotation3D.cs
- RSAOAEPKeyExchangeFormatter.cs
- DerivedKeySecurityTokenStub.cs
- XamlPoint3DCollectionSerializer.cs
- MultiBindingExpression.cs
- SafeLibraryHandle.cs
- ReadOnlyTernaryTree.cs
- UrlAuthFailedErrorFormatter.cs
- Effect.cs
- WebScriptMetadataMessage.cs
- EditBehavior.cs
- ExpressionsCollectionConverter.cs
- XhtmlBasicValidationSummaryAdapter.cs
- TraceLevelHelper.cs
- ConstraintEnumerator.cs
- _ListenerResponseStream.cs
- AdornerHitTestResult.cs
- EntityParameter.cs
- WebPartsSection.cs
- HttpPostedFile.cs
- PersonalizablePropertyEntry.cs
- KoreanLunisolarCalendar.cs
- TableHeaderCell.cs
- PolicyConversionContext.cs
- InvalidCommandTreeException.cs
- PrintingPermissionAttribute.cs
- SystemIcmpV6Statistics.cs
- TextElementCollectionHelper.cs
- BoundsDrawingContextWalker.cs
- GroupJoinQueryOperator.cs
- HttpResponseHeader.cs
- XmlNamespaceDeclarationsAttribute.cs
- HttpModulesSection.cs
- ProgressiveCrcCalculatingStream.cs
- ToolStripTextBox.cs
- ObjectItemNoOpAssemblyLoader.cs
- DiscoveryMessageSequenceGenerator.cs
- Util.cs
- SqlRowUpdatedEvent.cs
- ObjectItemCollection.cs
- PackUriHelper.cs
- AttachmentService.cs
- TemplateControlParser.cs
- FilteredDataSetHelper.cs
- DataGridViewRowHeaderCell.cs
- IssuanceLicense.cs
- TableLayoutPanelCellPosition.cs
- LookupTables.cs
- WmfPlaceableFileHeader.cs
- DataBinding.cs
- RtfToXamlReader.cs
- XmlDataImplementation.cs
- PingReply.cs
- RangeEnumerable.cs
- TabControl.cs
- ListViewItem.cs
- EnvelopedPkcs7.cs
- RequestSecurityTokenResponse.cs
- RuleAction.cs
- PageThemeParser.cs
- WebBrowserDocumentCompletedEventHandler.cs
- GradientBrush.cs
- XmlSchemaObject.cs
- RegisteredExpandoAttribute.cs
- ResolveDuplexAsyncResult.cs
- WsatServiceCertificate.cs
- XmlObjectSerializer.cs
- Color.cs
- QueryOutputWriter.cs
- DataGridViewRowEventArgs.cs
- TypeUtil.cs
- FixedDSBuilder.cs
- XPathNavigatorReader.cs
- SqlNotificationEventArgs.cs
- ObjectView.cs
- ResourceAssociationTypeEnd.cs
- ApplicationServiceManager.cs
- WorkItem.cs
- WebResponse.cs
- PrimitiveDataContract.cs
- ElementAction.cs
- CustomAttributeBuilder.cs
- StringDictionaryCodeDomSerializer.cs