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
- MouseGestureConverter.cs
- UndirectedGraph.cs
- UnsafeNativeMethods.cs
- Int16AnimationBase.cs
- FixedSOMImage.cs
- SR.cs
- ImplicitInputBrush.cs
- Scene3D.cs
- CodeDelegateInvokeExpression.cs
- DataBinder.cs
- CompilerInfo.cs
- Context.cs
- DataGridViewCellMouseEventArgs.cs
- ManipulationDevice.cs
- FloaterParaClient.cs
- ValueChangedEventManager.cs
- IndexedEnumerable.cs
- EntityWithKeyStrategy.cs
- ReplacementText.cs
- WebColorConverter.cs
- PreProcessInputEventArgs.cs
- SQLInt16.cs
- CFGGrammar.cs
- SpecularMaterial.cs
- ColorAnimationUsingKeyFrames.cs
- XmlWhitespace.cs
- FixUpCollection.cs
- DiagnosticTrace.cs
- RuntimeResourceSet.cs
- PostBackOptions.cs
- SemanticResultKey.cs
- DataColumnCollection.cs
- TemplatePropertyEntry.cs
- DispatcherEventArgs.cs
- LineServices.cs
- BrowserCapabilitiesFactory.cs
- CodeBlockBuilder.cs
- InnerItemCollectionView.cs
- FlowchartStart.xaml.cs
- TraceSection.cs
- DirectoryObjectSecurity.cs
- TabletCollection.cs
- isolationinterop.cs
- MemoryFailPoint.cs
- Module.cs
- BindingManagerDataErrorEventArgs.cs
- ConnectionProviderAttribute.cs
- XamlWrappingReader.cs
- InvalidFilterCriteriaException.cs
- SchemaMerger.cs
- SrgsElementList.cs
- RtfControls.cs
- DaylightTime.cs
- FormsAuthenticationUserCollection.cs
- StatusBarItem.cs
- DirectoryObjectSecurity.cs
- X509Certificate2.cs
- TextSchema.cs
- UrlPropertyAttribute.cs
- BinaryConverter.cs
- CurrencyManager.cs
- ConnectionString.cs
- GorillaCodec.cs
- IImplicitResourceProvider.cs
- IsolatedStorageSecurityState.cs
- printdlgexmarshaler.cs
- XmlAttributeCollection.cs
- SqlConnectionHelper.cs
- Color.cs
- AtomParser.cs
- TrackingRecord.cs
- MainMenu.cs
- StrongNamePublicKeyBlob.cs
- FreezableDefaultValueFactory.cs
- OuterGlowBitmapEffect.cs
- LogicalMethodInfo.cs
- FlowLayoutSettings.cs
- DebugInfoExpression.cs
- IgnoreFlushAndCloseStream.cs
- CellLabel.cs
- BufferedReadStream.cs
- ContainerSelectorBehavior.cs
- AssemblyEvidenceFactory.cs
- SmtpReplyReaderFactory.cs
- SHA384.cs
- QilPatternVisitor.cs
- DataContractSerializerOperationGenerator.cs
- ConnectionManagementElement.cs
- Page.cs
- Oci.cs
- URL.cs
- OleDbConnectionInternal.cs
- DataGridViewCell.cs
- EmbeddedMailObject.cs
- OdbcCommandBuilder.cs
- XPathExpr.cs
- SafeTokenHandle.cs
- Point4D.cs
- SspiSafeHandles.cs
- MsmqTransportSecurity.cs