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
- PreviewKeyDownEventArgs.cs
- _KerberosClient.cs
- NameScope.cs
- XmlDocument.cs
- DecimalConstantAttribute.cs
- ExpressionBuilder.cs
- Gdiplus.cs
- ProxyManager.cs
- Int32KeyFrameCollection.cs
- UnaryNode.cs
- DataGridViewCellValueEventArgs.cs
- SqlCacheDependencySection.cs
- Console.cs
- HandlerBase.cs
- PropertyExpression.cs
- BufferAllocator.cs
- ListDictionaryInternal.cs
- DataSvcMapFileSerializer.cs
- RectangleConverter.cs
- OuterGlowBitmapEffect.cs
- HtmlLink.cs
- Normalizer.cs
- LostFocusEventManager.cs
- SessionStateUtil.cs
- MenuAdapter.cs
- QilNode.cs
- ToolZone.cs
- LabelDesigner.cs
- SHA512.cs
- ExtendedPropertyDescriptor.cs
- PersonalizationProvider.cs
- SafeReadContext.cs
- DBCSCodePageEncoding.cs
- StringConverter.cs
- TemplatePropertyEntry.cs
- WorkItem.cs
- IsolatedStorageException.cs
- SmiContextFactory.cs
- ImageKeyConverter.cs
- DataGridViewUtilities.cs
- Mouse.cs
- StoreContentChangedEventArgs.cs
- EncryptedReference.cs
- DiagnosticEventProvider.cs
- DataGridTextBoxColumn.cs
- MemberExpressionHelper.cs
- OleDbRowUpdatingEvent.cs
- CodeCompiler.cs
- DataGridCaption.cs
- VirtualizingStackPanel.cs
- MethodAccessException.cs
- GeneratedContractType.cs
- HelpProvider.cs
- OptimizerPatterns.cs
- TraversalRequest.cs
- TemplateManager.cs
- SafeSecurityHandles.cs
- ipaddressinformationcollection.cs
- CompilerParameters.cs
- HtmlTableCell.cs
- GeometryCollection.cs
- SynchronizedInputProviderWrapper.cs
- HTTPNotFoundHandler.cs
- EditorBrowsableAttribute.cs
- CallbackValidator.cs
- DataControlCommands.cs
- TableLayout.cs
- OutputCacheModule.cs
- Content.cs
- ResetableIterator.cs
- TextServicesContext.cs
- HttpHeaderCollection.cs
- DataViewListener.cs
- SystemColorTracker.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- Graphics.cs
- Column.cs
- WebBrowserProgressChangedEventHandler.cs
- DockProviderWrapper.cs
- SafeEventLogWriteHandle.cs
- InkSerializer.cs
- EntitySet.cs
- AlphabeticalEnumConverter.cs
- ContractMapping.cs
- ZipFileInfoCollection.cs
- WriteableOnDemandPackagePart.cs
- CodeMethodReturnStatement.cs
- CoTaskMemSafeHandle.cs
- SchemaLookupTable.cs
- ButtonBase.cs
- DataGridCaption.cs
- MenuStrip.cs
- ListenerElementsCollection.cs
- PropertyEmitter.cs
- PowerModeChangedEventArgs.cs
- ValidatedControlConverter.cs
- recordstatescratchpad.cs
- InkCanvasSelectionAdorner.cs
- OleDbStruct.cs
- RTTrackingProfile.cs