Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / Data / SortFieldComparer.cs / 1305600 / SortFieldComparer.cs
//---------------------------------------------------------------------------- // //// Copyright (C) 2003 by Microsoft Corporation. All rights reserved. // // // // Description: IComparer class to sort by class property value (using reflection). // // See spec at http://avalon/connecteddata/M5%20Specs/IDataCollection.mht // // History: // 06/02/2003 : [....] - Created // //--------------------------------------------------------------------------- using System; using System.ComponentModel; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Globalization; using MS.Utility; using System.Windows; namespace MS.Internal.Data { ////// IComparer class to sort by class property value (using reflection). /// internal class SortFieldComparer : IComparer { ////// Create a comparer, using the SortDescription and a Type; /// tries to find a reflection PropertyInfo for each property name /// /// list of property names and direction to sort by /// culture to use for comparisons internal SortFieldComparer(SortDescriptionCollection sortFields, CultureInfo culture) { _sortFields = sortFields; _fields = CreatePropertyInfo(_sortFields); // create the comparer _comparer = (culture == null || culture == CultureInfo.InvariantCulture) ? Comparer.DefaultInvariant : (culture == CultureInfo.CurrentCulture) ? Comparer.Default : new Comparer(culture); } ////// Compares two objects and returns a value indicating whether one is less than, equal to or greater than the other. /// /// first item to compare /// second item to compare ///; <0: o1 < o2; =0: o1 == o2; > 0: o1 > o2 ////// Compares the 2 items using the list of property names and directions. /// public int Compare(object o1, object o2) { int result = 0; // compare both objects by each of the properties until property values don't match for (int k = 0; k < _fields.Length; ++k) { object v1 = _fields[k].GetValue(o1); object v2 = _fields[k].GetValue(o2); result = _comparer.Compare(v1, v2); if (_fields[k].descending) result = -result; if (result != 0) break; } return result; } // Helper method for sorting an ArrayList. If the comparer is a SortFieldComparer, // use the cached-value approach to avoid excessive reflection. For other // comparers, sort the usual way internal static void SortHelper(ArrayList al, IComparer comparer) { SortFieldComparer sfc = comparer as SortFieldComparer; if (sfc == null) { // sort the usual way al.Sort(comparer); } else { // Sort with cached values. // Step 1. Copy the items into a list augmented with slots for // the cached values. int n = al.Count; int nFields = sfc._fields.Length; CachedValueItem[] list = new CachedValueItem[n]; for (int i=0; i// Copyright (C) 2003 by Microsoft Corporation. All rights reserved. // // // // Description: IComparer class to sort by class property value (using reflection). // // See spec at http://avalon/connecteddata/M5%20Specs/IDataCollection.mht // // History: // 06/02/2003 : [....] - Created // //--------------------------------------------------------------------------- using System; using System.ComponentModel; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Globalization; using MS.Utility; using System.Windows; namespace MS.Internal.Data { /// /// IComparer class to sort by class property value (using reflection). /// internal class SortFieldComparer : IComparer { ////// Create a comparer, using the SortDescription and a Type; /// tries to find a reflection PropertyInfo for each property name /// /// list of property names and direction to sort by /// culture to use for comparisons internal SortFieldComparer(SortDescriptionCollection sortFields, CultureInfo culture) { _sortFields = sortFields; _fields = CreatePropertyInfo(_sortFields); // create the comparer _comparer = (culture == null || culture == CultureInfo.InvariantCulture) ? Comparer.DefaultInvariant : (culture == CultureInfo.CurrentCulture) ? Comparer.Default : new Comparer(culture); } ////// Compares two objects and returns a value indicating whether one is less than, equal to or greater than the other. /// /// first item to compare /// second item to compare ///; <0: o1 < o2; =0: o1 == o2; > 0: o1 > o2 ////// Compares the 2 items using the list of property names and directions. /// public int Compare(object o1, object o2) { int result = 0; // compare both objects by each of the properties until property values don't match for (int k = 0; k < _fields.Length; ++k) { object v1 = _fields[k].GetValue(o1); object v2 = _fields[k].GetValue(o2); result = _comparer.Compare(v1, v2); if (_fields[k].descending) result = -result; if (result != 0) break; } return result; } // Helper method for sorting an ArrayList. If the comparer is a SortFieldComparer, // use the cached-value approach to avoid excessive reflection. For other // comparers, sort the usual way internal static void SortHelper(ArrayList al, IComparer comparer) { SortFieldComparer sfc = comparer as SortFieldComparer; if (sfc == null) { // sort the usual way al.Sort(comparer); } else { // Sort with cached values. // Step 1. Copy the items into a list augmented with slots for // the cached values. int n = al.Count; int nFields = sfc._fields.Length; CachedValueItem[] list = new CachedValueItem[n]; for (int i=0; i
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Vector.cs
- regiisutil.cs
- UserPreferenceChangedEventArgs.cs
- SymbolTable.cs
- ImpersonateTokenRef.cs
- PropertyToken.cs
- CodeMemberField.cs
- SymbolEqualComparer.cs
- StyleBamlTreeBuilder.cs
- ThemeableAttribute.cs
- DocComment.cs
- CalendarButton.cs
- XmlBinaryReader.cs
- unitconverter.cs
- MetadataItemCollectionFactory.cs
- ClientOptions.cs
- BitmapSource.cs
- XmlWriterTraceListener.cs
- EntityPropertyMappingAttribute.cs
- FileDetails.cs
- Closure.cs
- GeometryValueSerializer.cs
- SQLInt64Storage.cs
- AssemblyCache.cs
- DataControlField.cs
- EarlyBoundInfo.cs
- NativeCompoundFileAPIs.cs
- ErrorStyle.cs
- HwndProxyElementProvider.cs
- XmlSchemaAny.cs
- UnsafeNativeMethods.cs
- URIFormatException.cs
- CacheForPrimitiveTypes.cs
- SystemResourceKey.cs
- SafeNativeMethodsCLR.cs
- FormatConvertedBitmap.cs
- ParserOptions.cs
- AssociationTypeEmitter.cs
- PassportAuthenticationModule.cs
- BoundColumn.cs
- QilCloneVisitor.cs
- BinaryMessageFormatter.cs
- Brush.cs
- RemoteWebConfigurationHost.cs
- PropertyHelper.cs
- EdmValidator.cs
- ContractNamespaceAttribute.cs
- RelationalExpressions.cs
- MutexSecurity.cs
- Relationship.cs
- DataObjectCopyingEventArgs.cs
- DocumentPaginator.cs
- UserControl.cs
- PageFunction.cs
- BaseCollection.cs
- CursorConverter.cs
- GuidelineCollection.cs
- WinEventWrap.cs
- FamilyMapCollection.cs
- EncodingStreamWrapper.cs
- StringValidatorAttribute.cs
- ResourceSet.cs
- SoapObjectReader.cs
- ChildTable.cs
- EntityDataSourceConfigureObjectContext.cs
- HttpTransportManager.cs
- HttpApplicationFactory.cs
- GlobalAllocSafeHandle.cs
- CacheMemory.cs
- AvTrace.cs
- PerformanceCounterCategory.cs
- CompilerState.cs
- TemplateField.cs
- HttpModuleCollection.cs
- DispatcherObject.cs
- ClientScriptItem.cs
- WebPartTransformerAttribute.cs
- SettingsBindableAttribute.cs
- TdsParserSessionPool.cs
- InvalidOperationException.cs
- StorageConditionPropertyMapping.cs
- ComPersistableTypeElementCollection.cs
- AspNetSynchronizationContext.cs
- ServicePoint.cs
- WindowShowOrOpenTracker.cs
- ThreadExceptionEvent.cs
- BinaryObjectReader.cs
- SmiTypedGetterSetter.cs
- RegexMatchCollection.cs
- MessageQuerySet.cs
- InternalEnumValidator.cs
- Profiler.cs
- DetailsViewUpdateEventArgs.cs
- AttributeQuery.cs
- EntitySqlQueryBuilder.cs
- WizardStepCollectionEditor.cs
- LayoutManager.cs
- cache.cs
- ToolStripPanelRow.cs
- CustomUserNameSecurityTokenAuthenticator.cs