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
- XmlEntityReference.cs
- DefinitionUpdate.cs
- DESCryptoServiceProvider.cs
- PanelDesigner.cs
- ActivationService.cs
- DrawingServices.cs
- CapabilitiesAssignment.cs
- TransformerInfo.cs
- MoveSizeWinEventHandler.cs
- ReferentialConstraint.cs
- ProcessModelInfo.cs
- SecureStringHasher.cs
- DataGridToolTip.cs
- XpsDigitalSignature.cs
- ACE.cs
- Operand.cs
- _HTTPDateParse.cs
- Image.cs
- MetabaseReader.cs
- SoapSchemaImporter.cs
- DataGridCell.cs
- COM2PropertyBuilderUITypeEditor.cs
- RestClientProxyHandler.cs
- FigureParagraph.cs
- SafeLibraryHandle.cs
- DriveNotFoundException.cs
- DictionaryContent.cs
- FormsAuthenticationUserCollection.cs
- GeneralTransform3DGroup.cs
- CellConstantDomain.cs
- RandomNumberGenerator.cs
- SurrogateEncoder.cs
- SizeChangedInfo.cs
- FamilyMapCollection.cs
- ToolStripStatusLabel.cs
- WriteTimeStream.cs
- CurrentChangingEventArgs.cs
- WebPartEditorOkVerb.cs
- PeerUnsafeNativeCryptMethods.cs
- ContextMenu.cs
- BrowserDefinition.cs
- HTTPNotFoundHandler.cs
- ServiceReference.cs
- DefaultCommandConverter.cs
- GenericPrincipal.cs
- ContentElementAutomationPeer.cs
- Operator.cs
- Schema.cs
- TimeSpanStorage.cs
- HtmlWindowCollection.cs
- CurrentTimeZone.cs
- CallContext.cs
- QilStrConcatenator.cs
- AtomEntry.cs
- DataContext.cs
- DocumentSignatureManager.cs
- ConfigurationSchemaErrors.cs
- InkSerializer.cs
- XsltInput.cs
- ToolStripGripRenderEventArgs.cs
- ImageDrawing.cs
- FontDifferentiator.cs
- TraceInternal.cs
- ApplicationFileCodeDomTreeGenerator.cs
- InvalidFilterCriteriaException.cs
- ProxyGenerationError.cs
- HttpBrowserCapabilitiesWrapper.cs
- RegexWriter.cs
- MSG.cs
- CommandManager.cs
- ReceiveParametersContent.cs
- dbdatarecord.cs
- CombinedGeometry.cs
- UInt16.cs
- XhtmlBasicTextBoxAdapter.cs
- httpserverutility.cs
- DataSourceNameHandler.cs
- SupportingTokenDuplexChannel.cs
- CFStream.cs
- CodeDefaultValueExpression.cs
- HttpInputStream.cs
- OleDbError.cs
- XmlComment.cs
- LabelAutomationPeer.cs
- DataRecordInfo.cs
- ApplicationDirectory.cs
- GlobalProxySelection.cs
- Trace.cs
- ExternalFile.cs
- EntityViewGenerationConstants.cs
- DBBindings.cs
- RepeaterItem.cs
- MimeBasePart.cs
- SecurityTokenProvider.cs
- CopyAction.cs
- SchemaNames.cs
- Shape.cs
- Geometry.cs
- StrokeRenderer.cs
- BoolExpressionVisitors.cs