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
- ConnectionManagementElement.cs
- NativeMethodsOther.cs
- XmlJsonWriter.cs
- MarkupCompilePass1.cs
- BitHelper.cs
- PresentationSource.cs
- ListViewVirtualItemsSelectionRangeChangedEvent.cs
- GlobalizationSection.cs
- FamilyTypefaceCollection.cs
- PrivateFontCollection.cs
- FormatVersion.cs
- DataGridViewCellCollection.cs
- SafeEventLogWriteHandle.cs
- WebBrowserPermission.cs
- HandlerWithFactory.cs
- ArgIterator.cs
- DataGridRow.cs
- PlainXmlSerializer.cs
- SmtpFailedRecipientsException.cs
- odbcmetadatafactory.cs
- NumericUpDownAccelerationCollection.cs
- RangeBase.cs
- XPathNode.cs
- HttpDateParse.cs
- WebPartCatalogCloseVerb.cs
- HelpEvent.cs
- MenuItemAutomationPeer.cs
- MemberInfoSerializationHolder.cs
- BeginEvent.cs
- SmtpNtlmAuthenticationModule.cs
- ViewManagerAttribute.cs
- smtppermission.cs
- DefaultValueConverter.cs
- RegisteredExpandoAttribute.cs
- ControlSerializer.cs
- CombinedTcpChannel.cs
- _Rfc2616CacheValidators.cs
- HitTestDrawingContextWalker.cs
- SmtpMail.cs
- ChangesetResponse.cs
- SecurityChannel.cs
- Privilege.cs
- CommandDesigner.cs
- XMLSyntaxException.cs
- PathTooLongException.cs
- ThreadSafeList.cs
- DbConnectionPoolIdentity.cs
- BindingWorker.cs
- WebBrowserEvent.cs
- EdmItemCollection.OcAssemblyCache.cs
- SqlOuterApplyReducer.cs
- XPathMessageFilterElementCollection.cs
- ChannelTracker.cs
- XmlLoader.cs
- StreamingContext.cs
- MulticastDelegate.cs
- HelpEvent.cs
- OperationDescriptionCollection.cs
- DocumentPage.cs
- SafeEventLogWriteHandle.cs
- DescendantOverDescendantQuery.cs
- ExpressionBinding.cs
- GridItem.cs
- BStrWrapper.cs
- XmlMemberMapping.cs
- VoiceInfo.cs
- CheckedListBox.cs
- SmtpNtlmAuthenticationModule.cs
- ReadOnlyPropertyMetadata.cs
- FontClient.cs
- PlanCompilerUtil.cs
- BamlCollectionHolder.cs
- TdsParserSessionPool.cs
- PropertyGridCommands.cs
- XXXInfos.cs
- DataGridViewDataErrorEventArgs.cs
- SchemaImporterExtensionsSection.cs
- PointCollection.cs
- RenderTargetBitmap.cs
- DataKey.cs
- TextDataBindingHandler.cs
- PersianCalendar.cs
- EndpointAddressMessageFilter.cs
- OutputCacheProfileCollection.cs
- baseshape.cs
- PeerCustomResolverBindingElement.cs
- TypeDescriptionProviderAttribute.cs
- ListControl.cs
- ExecutionEngineException.cs
- PolicyLevel.cs
- WindowProviderWrapper.cs
- CodeNamespaceCollection.cs
- ComponentRenameEvent.cs
- TemplatePartAttribute.cs
- InvalidAsynchronousStateException.cs
- ResponseBodyWriter.cs
- WaitHandle.cs
- TemplateParser.cs
- BatchServiceHost.cs
- DesignTimeValidationFeature.cs