Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- TextEndOfLine.cs
- ToolTipService.cs
- IERequestCache.cs
- XmlAttributeProperties.cs
- DataGridViewMethods.cs
- CheckBoxAutomationPeer.cs
- PipeConnection.cs
- SamlSecurityTokenAuthenticator.cs
- HMACSHA384.cs
- GroupQuery.cs
- HelpEvent.cs
- GenericRootAutomationPeer.cs
- PageCatalogPart.cs
- WinEventHandler.cs
- DataGridAutoFormat.cs
- WorkflowQueue.cs
- EllipseGeometry.cs
- BaseComponentEditor.cs
- SoapSchemaImporter.cs
- CuspData.cs
- TemplateControl.cs
- SBCSCodePageEncoding.cs
- XmlSchemaSimpleContent.cs
- XmlRawWriter.cs
- MediaTimeline.cs
- ToolStripDropDownItem.cs
- BaseHashHelper.cs
- XmlSerializerAssemblyAttribute.cs
- DBConnectionString.cs
- TableRow.cs
- IndentTextWriter.cs
- AutoResetEvent.cs
- DocumentGrid.cs
- PageSetupDialog.cs
- UnionExpr.cs
- ListItemCollection.cs
- DataFieldConverter.cs
- IdentityReference.cs
- Page.cs
- SignatureResourcePool.cs
- XmlStreamedByteStreamReader.cs
- PrefixQName.cs
- Size3DValueSerializer.cs
- ProxyWebPartManager.cs
- DocumentApplicationState.cs
- QilReplaceVisitor.cs
- Transform.cs
- TypeGeneratedEventArgs.cs
- XPathAncestorIterator.cs
- Font.cs
- ListItemViewControl.cs
- KeyTime.cs
- RawStylusSystemGestureInputReport.cs
- UserControl.cs
- CursorConverter.cs
- TransformDescriptor.cs
- BaseDataList.cs
- DateTimeSerializationSection.cs
- ApplicationServiceManager.cs
- _FixedSizeReader.cs
- ScriptingAuthenticationServiceSection.cs
- CodeAttributeArgument.cs
- FilterException.cs
- InfocardInteractiveChannelInitializer.cs
- SignatureResourcePool.cs
- XmlException.cs
- ResourceExpressionBuilder.cs
- FileCodeGroup.cs
- QilName.cs
- ComponentResourceKeyConverter.cs
- TextureBrush.cs
- Color.cs
- DecoderExceptionFallback.cs
- OpCopier.cs
- BindingList.cs
- TextEncodedRawTextWriter.cs
- ClientUtils.cs
- Group.cs
- CombinedGeometry.cs
- Asn1IntegerConverter.cs
- HttpBindingExtension.cs
- UnionCqlBlock.cs
- ImageClickEventArgs.cs
- XmlILConstructAnalyzer.cs
- SkinBuilder.cs
- DirectoryLocalQuery.cs
- PolicyChain.cs
- TextRenderer.cs
- SemanticResolver.cs
- LookupNode.cs
- GradientBrush.cs
- TCPClient.cs
- Calendar.cs
- DecoderExceptionFallback.cs
- LabelLiteral.cs
- XmlUtil.cs
- EnumUnknown.cs
- DataListItem.cs
- SqlFunctionAttribute.cs
- TargetControlTypeCache.cs