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
- CompensatableSequenceActivity.cs
- SystemInformation.cs
- DataGridSortCommandEventArgs.cs
- CommandDevice.cs
- ObjectListField.cs
- LabelLiteral.cs
- DataBindingHandlerAttribute.cs
- StreamingContext.cs
- XamlToRtfParser.cs
- FreeFormPanel.cs
- FixUpCollection.cs
- ExtendedProtectionPolicyTypeConverter.cs
- baseaxisquery.cs
- TextRenderer.cs
- HostAdapter.cs
- Compensation.cs
- FlowLayoutSettings.cs
- MenuEventArgs.cs
- ItemTypeToolStripMenuItem.cs
- UnitySerializationHolder.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- SingleTagSectionHandler.cs
- SpecularMaterial.cs
- ObjectKeyFrameCollection.cs
- VisualBasicHelper.cs
- ExtendedPropertyCollection.cs
- WebPartMinimizeVerb.cs
- ImageAnimator.cs
- SchemaEntity.cs
- IisTraceListener.cs
- SqlWorkflowPersistenceService.cs
- StateValidator.cs
- ZeroOpNode.cs
- PathData.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- CharacterBufferReference.cs
- CachedCompositeFamily.cs
- listitem.cs
- RevocationPoint.cs
- Nodes.cs
- SafeCryptoHandles.cs
- StatusBarPanel.cs
- ClaimTypes.cs
- EdmType.cs
- BaseParaClient.cs
- ServiceInfoCollection.cs
- ElementNotAvailableException.cs
- FlowDocumentView.cs
- GradientBrush.cs
- ConfigXmlComment.cs
- StringFreezingAttribute.cs
- UnmanagedHandle.cs
- NullPackagingPolicy.cs
- PersistChildrenAttribute.cs
- TextEffectCollection.cs
- LinkDesigner.cs
- NotifyParentPropertyAttribute.cs
- SecureEnvironment.cs
- DeploymentSectionCache.cs
- TypeUnloadedException.cs
- HttpHandlerAction.cs
- MouseGestureValueSerializer.cs
- cookie.cs
- DeadCharTextComposition.cs
- QilReference.cs
- RectConverter.cs
- XmlHelper.cs
- TagPrefixAttribute.cs
- LocalizabilityAttribute.cs
- StandardOleMarshalObject.cs
- ConfigurationValues.cs
- KeyBinding.cs
- TdsParameterSetter.cs
- ScriptHandlerFactory.cs
- SamlNameIdentifierClaimResource.cs
- AudioSignalProblemOccurredEventArgs.cs
- SimpleTextLine.cs
- XmlTextReaderImpl.cs
- ModulesEntry.cs
- TextTreeFixupNode.cs
- WebBrowserEvent.cs
- XamlDesignerSerializationManager.cs
- smtppermission.cs
- ColorConverter.cs
- Cast.cs
- EventBuilder.cs
- TextEditorMouse.cs
- AppDomainAttributes.cs
- BrowserDefinitionCollection.cs
- RegexReplacement.cs
- NetworkInformationPermission.cs
- RIPEMD160.cs
- EntityDataSourceChangingEventArgs.cs
- ActivityBuilderHelper.cs
- AppSecurityManager.cs
- TrackingMemoryStream.cs
- SerialReceived.cs
- Formatter.cs
- FontClient.cs
- FilteredDataSetHelper.cs