Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / CompMod / System / Collections / Specialized / FixedStringLookup.cs / 1305376 / FixedStringLookup.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Collections.Specialized {
using System;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
// This class provides a very efficient way to lookup an entry in a list of strings,
// providing that they are declared in a particular way.
// It requires the set of strings to be orderded into an array of arrays of strings.
// The first indexer must the length of the string, so that each sub-array is of the
// same length. The contained array must be in alphabetical order. Furthermore, if the
// table is to be searched case-insensitively, the strings must all be lower case.
internal static class FixedStringLookup {
// Returns whether the match is found in the lookup table
internal static bool Contains(string[][] lookupTable, string value, bool ignoreCase) {
int length = value.Length;
if (length <= 0 || length - 1 >= lookupTable.Length) {
return false;
}
string[] subArray = lookupTable[length - 1];
if (subArray == null) {
return false;
}
return Contains(subArray, value, ignoreCase);
}
#if DEBUG
internal static void VerifyLookupTable(string[][] lookupTable, bool ignoreCase) {
for (int i = 0; i < lookupTable.Length; i++) {
string[] subArray = lookupTable[i];
if (subArray != null) {
string lastValue = null;
for (int j = 0; j < subArray.Length; j++) {
string value = subArray[j];
// Must all be the length of the hashed position
Debug.Assert(value.Length == i + 1, "Lookup table contains an item in the wrong subtable. Item name: " + value);
if (lastValue != null) {
// Must be sorted within the sub array;
Debug.Assert(string.Compare(lastValue, value, ((ignoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal)) < 0,
String.Format(CultureInfo.InvariantCulture, "Lookup table is out of order. Items {0} and {1} are reversed", lastValue, value));
}
lastValue = value;
}
}
}
}
#endif
// This routine finds a hit within a single sorted array, with the assumption that the
// value and all the strings are of the same length.
private static bool Contains(string[] array, string value, bool ignoreCase) {
int min = 0;
int max = array.Length;
int pos = 0;
char searchChar;
while (pos < value.Length) {
if (ignoreCase) {
searchChar = char.ToLower(value[pos], CultureInfo.InvariantCulture);
} else {
searchChar = value[pos];
}
if ((max - min) <= 1) {
// we are down to a single item, so we can stay on this row until the end.
if (searchChar != array[min][pos]) {
return false;
}
pos++;
continue;
}
// There are multiple items to search, use binary search to find one of the hits
if (!FindCharacter(array, searchChar, pos, ref min, ref max)) {
return false;
}
// and move to next char
pos++;
}
return true;
}
// Do a binary search on the character array at the specific position and constrict the ranges appropriately.
private static bool FindCharacter(string[] array, char value, int pos, ref int min, ref int max) {
int index = min;
while (min < max) {
index = (min + max) / 2;
char comp = array[index][pos];
if (value == comp) {
// We have a match. Now adjust to any adjacent matches
int newMin = index;
while (newMin > min && array[newMin - 1][pos] == value) {
newMin--;
}
min = newMin;
int newMax = index + 1;
while (newMax < max && array[newMax][pos] == value) {
newMax++;
}
max = newMax;
return true;
}
if (value < comp) {
max = index;
}
else {
min = index + 1;
}
}
return false;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Collections.Specialized {
using System;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
// This class provides a very efficient way to lookup an entry in a list of strings,
// providing that they are declared in a particular way.
// It requires the set of strings to be orderded into an array of arrays of strings.
// The first indexer must the length of the string, so that each sub-array is of the
// same length. The contained array must be in alphabetical order. Furthermore, if the
// table is to be searched case-insensitively, the strings must all be lower case.
internal static class FixedStringLookup {
// Returns whether the match is found in the lookup table
internal static bool Contains(string[][] lookupTable, string value, bool ignoreCase) {
int length = value.Length;
if (length <= 0 || length - 1 >= lookupTable.Length) {
return false;
}
string[] subArray = lookupTable[length - 1];
if (subArray == null) {
return false;
}
return Contains(subArray, value, ignoreCase);
}
#if DEBUG
internal static void VerifyLookupTable(string[][] lookupTable, bool ignoreCase) {
for (int i = 0; i < lookupTable.Length; i++) {
string[] subArray = lookupTable[i];
if (subArray != null) {
string lastValue = null;
for (int j = 0; j < subArray.Length; j++) {
string value = subArray[j];
// Must all be the length of the hashed position
Debug.Assert(value.Length == i + 1, "Lookup table contains an item in the wrong subtable. Item name: " + value);
if (lastValue != null) {
// Must be sorted within the sub array;
Debug.Assert(string.Compare(lastValue, value, ((ignoreCase) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal)) < 0,
String.Format(CultureInfo.InvariantCulture, "Lookup table is out of order. Items {0} and {1} are reversed", lastValue, value));
}
lastValue = value;
}
}
}
}
#endif
// This routine finds a hit within a single sorted array, with the assumption that the
// value and all the strings are of the same length.
private static bool Contains(string[] array, string value, bool ignoreCase) {
int min = 0;
int max = array.Length;
int pos = 0;
char searchChar;
while (pos < value.Length) {
if (ignoreCase) {
searchChar = char.ToLower(value[pos], CultureInfo.InvariantCulture);
} else {
searchChar = value[pos];
}
if ((max - min) <= 1) {
// we are down to a single item, so we can stay on this row until the end.
if (searchChar != array[min][pos]) {
return false;
}
pos++;
continue;
}
// There are multiple items to search, use binary search to find one of the hits
if (!FindCharacter(array, searchChar, pos, ref min, ref max)) {
return false;
}
// and move to next char
pos++;
}
return true;
}
// Do a binary search on the character array at the specific position and constrict the ranges appropriately.
private static bool FindCharacter(string[] array, char value, int pos, ref int min, ref int max) {
int index = min;
while (min < max) {
index = (min + max) / 2;
char comp = array[index][pos];
if (value == comp) {
// We have a match. Now adjust to any adjacent matches
int newMin = index;
while (newMin > min && array[newMin - 1][pos] == value) {
newMin--;
}
min = newMin;
int newMax = index + 1;
while (newMax < max && array[newMax][pos] == value) {
newMax++;
}
max = newMax;
return true;
}
if (value < comp) {
max = index;
}
else {
min = index + 1;
}
}
return false;
}
}
}
// 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
- NetworkCredential.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- DbCommandDefinition.cs
- OdbcEnvironment.cs
- MatrixTransform.cs
- DataRecordObjectView.cs
- TdsParameterSetter.cs
- X509ChainPolicy.cs
- EditingCoordinator.cs
- HMACSHA384.cs
- Panel.cs
- SqlProvider.cs
- UriParserTemplates.cs
- Single.cs
- Semaphore.cs
- MarkedHighlightComponent.cs
- mediaclock.cs
- cookie.cs
- XmlReflectionMember.cs
- HwndSourceKeyboardInputSite.cs
- SystemShuttingDownException.cs
- Cloud.cs
- RegexInterpreter.cs
- DoubleAnimation.cs
- AsyncPostBackTrigger.cs
- InternalResources.cs
- OciLobLocator.cs
- VerificationAttribute.cs
- ListViewGroupConverter.cs
- HostProtectionException.cs
- PlaceHolder.cs
- ExpressionLink.cs
- StrongTypingException.cs
- SID.cs
- QilFactory.cs
- FlowPanelDesigner.cs
- RightsManagementEncryptionTransform.cs
- Mouse.cs
- SoapInteropTypes.cs
- LineServicesCallbacks.cs
- Base64WriteStateInfo.cs
- BulletedList.cs
- FontWeight.cs
- CompilationLock.cs
- DependencyObjectValidator.cs
- util.cs
- HttpCapabilitiesSectionHandler.cs
- HandlerBase.cs
- FullTextBreakpoint.cs
- UIElement.cs
- ScriptResourceAttribute.cs
- Errors.cs
- DocumentReference.cs
- FloatUtil.cs
- FunctionParameter.cs
- CodeTypeReferenceExpression.cs
- CommunicationException.cs
- unitconverter.cs
- TypeAccessException.cs
- ActivityExecutionFilter.cs
- FixedPosition.cs
- RelationshipEndMember.cs
- storepermission.cs
- Crypto.cs
- XmlAutoDetectWriter.cs
- TransactionOptions.cs
- XPathDocumentNavigator.cs
- CompilerWrapper.cs
- SmtpNegotiateAuthenticationModule.cs
- BuilderPropertyEntry.cs
- WeakHashtable.cs
- Underline.cs
- RawKeyboardInputReport.cs
- TypeDelegator.cs
- RootBrowserWindow.cs
- DataControlExtensions.cs
- iisPickupDirectory.cs
- wmiprovider.cs
- Ipv6Element.cs
- XmlObjectSerializerReadContext.cs
- ProjectionPlanCompiler.cs
- StatusStrip.cs
- StrokeNodeEnumerator.cs
- ListBox.cs
- RotationValidation.cs
- DrawingCollection.cs
- CompilationLock.cs
- ComponentCollection.cs
- ProgressBar.cs
- DataGridItemAttachedStorage.cs
- TemplateModeChangedEventArgs.cs
- AssemblyFilter.cs
- DataServices.cs
- HttpModulesSection.cs
- ZoneMembershipCondition.cs
- UnsafeNativeMethods.cs
- StorageComplexPropertyMapping.cs
- WmlMobileTextWriter.cs
- KoreanLunisolarCalendar.cs
- CopyOnWriteList.cs