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
- MessageDispatch.cs
- ReferencedType.cs
- DataServiceRequestOfT.cs
- Literal.cs
- DodSequenceMerge.cs
- ListDesigner.cs
- PropertyMappingExceptionEventArgs.cs
- DataTemplateKey.cs
- HideDisabledControlAdapter.cs
- SqlConnectionHelper.cs
- DiagnosticsElement.cs
- AnnotationAdorner.cs
- PathSegmentCollection.cs
- ToolStripCustomTypeDescriptor.cs
- DocumentPageTextView.cs
- Label.cs
- FileDialogPermission.cs
- CompositeFontParser.cs
- ItemsChangedEventArgs.cs
- CatalogPartCollection.cs
- UrlPropertyAttribute.cs
- MsdtcWrapper.cs
- ActiveXHost.cs
- ImageCodecInfoPrivate.cs
- JumpTask.cs
- WeakReferenceEnumerator.cs
- RtfToXamlReader.cs
- _NestedMultipleAsyncResult.cs
- ItemDragEvent.cs
- FixedDocumentSequencePaginator.cs
- DbMetaDataFactory.cs
- CodeNamespaceImport.cs
- ScrollBar.cs
- BitmapEncoder.cs
- XmlToDatasetMap.cs
- CustomTypeDescriptor.cs
- ColorBuilder.cs
- DataContractSerializerOperationBehavior.cs
- SQLInt16Storage.cs
- PageCache.cs
- WindowsFormsEditorServiceHelper.cs
- XmlSchemaSimpleContentRestriction.cs
- PointValueSerializer.cs
- TrackingAnnotationCollection.cs
- DeadCharTextComposition.cs
- ConfigurationSectionGroupCollection.cs
- Variable.cs
- LogicalExpr.cs
- BitmapPalettes.cs
- SpellerHighlightLayer.cs
- TraceListener.cs
- KeyboardDevice.cs
- categoryentry.cs
- ParsedAttributeCollection.cs
- Translator.cs
- SyndicationLink.cs
- DictionaryEditChange.cs
- BlobPersonalizationState.cs
- ObjectSecurity.cs
- TemplateModeChangedEventArgs.cs
- RelationshipFixer.cs
- hresults.cs
- ValueType.cs
- SerializableAttribute.cs
- QilGeneratorEnv.cs
- GlyphElement.cs
- ImportContext.cs
- SingleTagSectionHandler.cs
- XmlStringTable.cs
- FontFaceLayoutInfo.cs
- XPathBinder.cs
- RolePrincipal.cs
- PointF.cs
- ProfilePropertySettingsCollection.cs
- SafeNativeMethods.cs
- BypassElement.cs
- GroupByExpressionRewriter.cs
- ColumnWidthChangingEvent.cs
- SystemIPAddressInformation.cs
- UserControl.cs
- ViewStateChangedEventArgs.cs
- TypeBuilder.cs
- X509ChainElement.cs
- GeneratedCodeAttribute.cs
- ComplusTypeValidator.cs
- IndexOutOfRangeException.cs
- ErrorHandler.cs
- ListBase.cs
- BitmapMetadataEnumerator.cs
- SqlFunctionAttribute.cs
- XmlRawWriterWrapper.cs
- UnsafeNativeMethodsMilCoreApi.cs
- TdsRecordBufferSetter.cs
- HtmlTableCell.cs
- WebPartsPersonalizationAuthorization.cs
- InfiniteIntConverter.cs
- RotateTransform3D.cs
- CheckBoxAutomationPeer.cs
- XslCompiledTransform.cs
- IdnMapping.cs