Code:
/ 4.0 / 4.0 / untmp / 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
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ScriptResourceMapping.cs
- AutomationTextAttribute.cs
- ToolStripSeparatorRenderEventArgs.cs
- RegexFCD.cs
- DirectoryInfo.cs
- XmlSchemaNotation.cs
- SecurityAlgorithmSuiteConverter.cs
- IRCollection.cs
- SqlServices.cs
- CodeTypeParameterCollection.cs
- VerticalConnector.xaml.cs
- _NegoState.cs
- WindowsEditBoxRange.cs
- TypefaceMap.cs
- Operand.cs
- Connector.cs
- BitmapEffectOutputConnector.cs
- LicenseException.cs
- MessageSecurityOverHttpElement.cs
- QueryOutputWriter.cs
- MaskedTextProvider.cs
- ObjectAssociationEndMapping.cs
- SerialPinChanges.cs
- LayoutEngine.cs
- RtfToken.cs
- ComponentDispatcherThread.cs
- DataPagerCommandEventArgs.cs
- cookiecontainer.cs
- COM2Enum.cs
- HttpVersion.cs
- ActivationServices.cs
- GlyphElement.cs
- TdsValueSetter.cs
- OverrideMode.cs
- PathNode.cs
- ToolZone.cs
- PropertyToken.cs
- RoutingConfiguration.cs
- SecureStringHasher.cs
- Thickness.cs
- DetailsViewPageEventArgs.cs
- DataControlReference.cs
- ValueQuery.cs
- NaturalLanguageHyphenator.cs
- Span.cs
- InstanceCollisionException.cs
- CodeAssignStatement.cs
- selecteditemcollection.cs
- DBCommand.cs
- StateDesignerConnector.cs
- HelpProvider.cs
- AutoCompleteStringCollection.cs
- SpellerError.cs
- UrlPath.cs
- XPathDocumentIterator.cs
- HasCopySemanticsAttribute.cs
- XmlLinkedNode.cs
- BamlLocalizer.cs
- ReservationCollection.cs
- unsafenativemethodstextservices.cs
- MessageQueueAccessControlEntry.cs
- ConstructorBuilder.cs
- InputReportEventArgs.cs
- RawUIStateInputReport.cs
- CellCreator.cs
- RegistrationServices.cs
- CellTreeNode.cs
- XmlSchemaObjectTable.cs
- VoiceSynthesis.cs
- Error.cs
- ObjectListCommandEventArgs.cs
- SafeArrayRankMismatchException.cs
- AdPostCacheSubstitution.cs
- RadioButtonList.cs
- GlyphRunDrawing.cs
- Internal.cs
- ReachDocumentSequenceSerializer.cs
- ConstructorExpr.cs
- SchemaNames.cs
- EntityTypeEmitter.cs
- WindowsIdentity.cs
- ComponentRenameEvent.cs
- DataGridCellClipboardEventArgs.cs
- DataTransferEventArgs.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- CustomErrorCollection.cs
- BaseAsyncResult.cs
- OleDbReferenceCollection.cs
- SiteMapDataSourceView.cs
- UnsafeNativeMethods.cs
- StylusCollection.cs
- Condition.cs
- SingleKeyFrameCollection.cs
- InvalidTimeZoneException.cs
- WCFBuildProvider.cs
- SQLUtility.cs
- DataGridViewCheckBoxCell.cs
- TrackingLocationCollection.cs
- PageBuildProvider.cs
- MouseActionValueSerializer.cs