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
- SqlTypeConverter.cs
- TransformGroup.cs
- DataGridViewCellParsingEventArgs.cs
- LinkUtilities.cs
- TypedDatasetGenerator.cs
- SafeEventLogWriteHandle.cs
- DesignTimeTemplateParser.cs
- ToolZone.cs
- HttpCookie.cs
- ImportContext.cs
- SpeechRecognitionEngine.cs
- HttpPostedFileBase.cs
- CommandDevice.cs
- MonitorWrapper.cs
- SimpleType.cs
- WorkItem.cs
- InkSerializer.cs
- OptimalBreakSession.cs
- IdentityReference.cs
- HtmlControlPersistable.cs
- NavigateEvent.cs
- DrawingGroupDrawingContext.cs
- TableStyle.cs
- X500Name.cs
- Separator.cs
- FileLogRecordEnumerator.cs
- WebPartPersonalization.cs
- ALinqExpressionVisitor.cs
- TextComposition.cs
- PackageFilter.cs
- StructuredTypeEmitter.cs
- SqlExpander.cs
- EntityDataSourceSelectingEventArgs.cs
- SeverityFilter.cs
- LicFileLicenseProvider.cs
- TagPrefixCollection.cs
- SocketAddress.cs
- AddingNewEventArgs.cs
- ContextStack.cs
- SettingsPropertyIsReadOnlyException.cs
- EntityProviderFactory.cs
- XhtmlConformanceSection.cs
- xamlnodes.cs
- Soap11ServerProtocol.cs
- PropertyConverter.cs
- MatrixAnimationUsingPath.cs
- WindowsFormsEditorServiceHelper.cs
- SystemColors.cs
- SafeFileMappingHandle.cs
- Hex.cs
- CompleteWizardStep.cs
- ExpandCollapsePattern.cs
- InkSerializer.cs
- GridView.cs
- EventMappingSettingsCollection.cs
- Attributes.cs
- XmlHelper.cs
- PolicyUnit.cs
- EnumMember.cs
- BooleanStorage.cs
- RuleSettings.cs
- IncrementalHitTester.cs
- Util.cs
- ColumnHeaderCollectionEditor.cs
- Propagator.cs
- WebSysDescriptionAttribute.cs
- DotExpr.cs
- PublisherMembershipCondition.cs
- ResolveCriteria11.cs
- PixelFormat.cs
- IndentTextWriter.cs
- DESCryptoServiceProvider.cs
- XmlNavigatorFilter.cs
- MergePropertyDescriptor.cs
- KeyConverter.cs
- ChangePassword.cs
- Separator.cs
- RegisteredExpandoAttribute.cs
- Base64Stream.cs
- CopyCodeAction.cs
- InfoCardKeyedHashAlgorithm.cs
- ISCIIEncoding.cs
- ServiceDesigner.cs
- CompressedStack.cs
- TableColumn.cs
- FlowDocumentFormatter.cs
- ObjRef.cs
- ControlBindingsCollection.cs
- LocatorManager.cs
- GlyphTypeface.cs
- XamlClipboardData.cs
- ListControlDesigner.cs
- CompiledIdentityConstraint.cs
- SearchForVirtualItemEventArgs.cs
- ProcessProtocolHandler.cs
- ListItem.cs
- TraceData.cs
- DynamicField.cs
- _SSPIWrapper.cs
- ParsedAttributeCollection.cs