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
- XmlBinaryWriterSession.cs
- FixedTextView.cs
- DataGridViewCellCollection.cs
- rsa.cs
- WebPartManagerDesigner.cs
- PriorityRange.cs
- SqlNamer.cs
- ComNativeDescriptor.cs
- BatchServiceHost.cs
- DataBindingList.cs
- Panel.cs
- TreeViewCancelEvent.cs
- EventLogHandle.cs
- QilFunction.cs
- InstanceBehavior.cs
- PersonalizationState.cs
- TreeViewBindingsEditorForm.cs
- ChannelServices.cs
- SocketElement.cs
- List.cs
- AssociationTypeEmitter.cs
- EntityPropertyMappingAttribute.cs
- HttpModule.cs
- InputMethod.cs
- HttpProfileBase.cs
- PageAsyncTaskManager.cs
- SiteMapDataSourceDesigner.cs
- SrgsDocument.cs
- StatusBarPanelClickEvent.cs
- ThaiBuddhistCalendar.cs
- InvokeProviderWrapper.cs
- PerfCounters.cs
- NonParentingControl.cs
- NativeCompoundFileAPIs.cs
- FreezableCollection.cs
- Dispatcher.cs
- SimpleWebHandlerParser.cs
- DataSourceXmlElementAttribute.cs
- ButtonFlatAdapter.cs
- ButtonBaseAutomationPeer.cs
- ContainerControl.cs
- x509store.cs
- Configuration.cs
- UxThemeWrapper.cs
- Switch.cs
- FormattedTextSymbols.cs
- TimerEventSubscription.cs
- Utility.cs
- CommentAction.cs
- WebPartTracker.cs
- ExecutionEngineException.cs
- XsdValidatingReader.cs
- RegexMatchCollection.cs
- PagePropertiesChangingEventArgs.cs
- Buffer.cs
- cryptoapiTransform.cs
- ProcessModuleCollection.cs
- TraceFilter.cs
- ConfigurationValue.cs
- OleDbConnectionFactory.cs
- MembershipValidatePasswordEventArgs.cs
- safePerfProviderHandle.cs
- FormViewDeletedEventArgs.cs
- Polygon.cs
- SynchronizedDispatch.cs
- OuterGlowBitmapEffect.cs
- CultureTable.cs
- httpserverutility.cs
- ConditionalAttribute.cs
- BaseTemplateBuildProvider.cs
- ExceptionList.cs
- UIInitializationException.cs
- ScheduleChanges.cs
- ControlValuePropertyAttribute.cs
- WinFormsSecurity.cs
- CustomLineCap.cs
- MsmqIntegrationBinding.cs
- CompilationLock.cs
- RunWorkerCompletedEventArgs.cs
- oledbconnectionstring.cs
- TextBoxAutoCompleteSourceConverter.cs
- AppDomainFactory.cs
- MultiSelectRootGridEntry.cs
- PopupRootAutomationPeer.cs
- CellRelation.cs
- ToolStripRendererSwitcher.cs
- MessageHeaderDescription.cs
- SafeNativeMethods.cs
- DynamicMetaObject.cs
- BeginEvent.cs
- SystemThemeKey.cs
- InstanceKeyView.cs
- mil_sdk_version.cs
- HelloOperationAsyncResult.cs
- DbDeleteCommandTree.cs
- TextRunProperties.cs
- PeerPresenceInfo.cs
- ErrorWrapper.cs
- SettingsPropertyNotFoundException.cs
- ListManagerBindingsCollection.cs