Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Framework / MS / Internal / Data / SortFieldComparer.cs / 1 / 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; } // Private Methods private SortPropertyInfo[] CreatePropertyInfo(SortDescriptionCollection sortFields) { SortPropertyInfo[] fields = new SortPropertyInfo[sortFields.Count]; for (int k = 0; k < sortFields.Count; ++k) { PropertyPath pp; if (String.IsNullOrEmpty(sortFields[k].PropertyName)) { // sort by the object itself (as opposed to a property) pp = null; } else { // sort by the value of a property path, to be applied to // the items in the list pp = new PropertyPath(sortFields[k].PropertyName); } // remember PropertyPath and direction, used when actually sorting fields[k].info = pp; fields[k].descending = (sortFields[k].Direction == ListSortDirection.Descending); } return fields; } // Private Fields struct SortPropertyInfo { internal PropertyPath info; internal bool descending; internal object GetValue(object o) { object value; if (info == null) { value = o; } else { using (info.SetContext(o)) { value = info.GetValue(); } } return value; } } SortPropertyInfo[] _fields; SortDescriptionCollection _sortFields; Comparer _comparer; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// 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; } // Private Methods private SortPropertyInfo[] CreatePropertyInfo(SortDescriptionCollection sortFields) { SortPropertyInfo[] fields = new SortPropertyInfo[sortFields.Count]; for (int k = 0; k < sortFields.Count; ++k) { PropertyPath pp; if (String.IsNullOrEmpty(sortFields[k].PropertyName)) { // sort by the object itself (as opposed to a property) pp = null; } else { // sort by the value of a property path, to be applied to // the items in the list pp = new PropertyPath(sortFields[k].PropertyName); } // remember PropertyPath and direction, used when actually sorting fields[k].info = pp; fields[k].descending = (sortFields[k].Direction == ListSortDirection.Descending); } return fields; } // Private Fields struct SortPropertyInfo { internal PropertyPath info; internal bool descending; internal object GetValue(object o) { object value; if (info == null) { value = o; } else { using (info.SetContext(o)) { value = info.GetValue(); } } return value; } } SortPropertyInfo[] _fields; SortDescriptionCollection _sortFields; Comparer _comparer; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- LinkedList.cs
- WindowsScrollBar.cs
- SafeRegistryHandle.cs
- HybridDictionary.cs
- WebBrowserDesigner.cs
- ApplicationSettingsBase.cs
- SiteOfOriginPart.cs
- sqlnorm.cs
- RuntimeResourceSet.cs
- Point.cs
- NameTable.cs
- DynamicValidatorEventArgs.cs
- AccessControlList.cs
- SelectionChangedEventArgs.cs
- XmlSerializerObjectSerializer.cs
- PaintEvent.cs
- GridErrorDlg.cs
- DataKeyArray.cs
- SimpleTypeResolver.cs
- Semaphore.cs
- FocusChangedEventArgs.cs
- Polygon.cs
- AsyncResult.cs
- PlainXmlDeserializer.cs
- EntityConnection.cs
- CompilerScope.Storage.cs
- ServicePointManagerElement.cs
- OLEDB_Util.cs
- IDReferencePropertyAttribute.cs
- XomlCompilerError.cs
- PolicyStatement.cs
- XmlName.cs
- SQLBytes.cs
- ParallelTimeline.cs
- activationcontext.cs
- DataGridItemCollection.cs
- XmlComment.cs
- SQLStringStorage.cs
- FilterException.cs
- Mouse.cs
- FirstMatchCodeGroup.cs
- Material.cs
- Unit.cs
- ToolStripDropDown.cs
- Encoding.cs
- Help.cs
- CategoryAttribute.cs
- WebZoneDesigner.cs
- ElementProxy.cs
- WinCategoryAttribute.cs
- SafeNativeMethods.cs
- RectAnimationClockResource.cs
- PolygonHotSpot.cs
- InvokeProviderWrapper.cs
- PnrpPermission.cs
- Expression.cs
- HyperLinkColumn.cs
- RichTextBox.cs
- CheckedPointers.cs
- TextServicesCompartmentEventSink.cs
- HwndMouseInputProvider.cs
- TableHeaderCell.cs
- AutomationPropertyInfo.cs
- OperationAbortedException.cs
- NavigationHelper.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- Keywords.cs
- OdbcConnectionPoolProviderInfo.cs
- TypeUtils.cs
- MenuItemBinding.cs
- GenerateTemporaryTargetAssembly.cs
- IndexerNameAttribute.cs
- DSGeneratorProblem.cs
- CookieProtection.cs
- SafeNativeMethods.cs
- ThousandthOfEmRealPoints.cs
- XmlSiteMapProvider.cs
- WebPartMinimizeVerb.cs
- IteratorFilter.cs
- DataSourceXmlAttributeAttribute.cs
- BooleanToSelectiveScrollingOrientationConverter.cs
- UntrustedRecipientException.cs
- Soap.cs
- FormatterServices.cs
- WebBrowserNavigatingEventHandler.cs
- WebRequestModuleElement.cs
- XhtmlBasicLiteralTextAdapter.cs
- Object.cs
- CodeDomSerializerException.cs
- CodeExpressionCollection.cs
- XmlILConstructAnalyzer.cs
- SystemDropShadowChrome.cs
- ResourceReader.cs
- ExtractedStateEntry.cs
- XmlSchemaDocumentation.cs
- TableLayoutCellPaintEventArgs.cs
- Listbox.cs
- DbParameterHelper.cs
- _HelperAsyncResults.cs
- DeviceOverridableAttribute.cs