SortFieldComparer.cs source code in C# .NET

Source code for the .NET framework in C#

                        

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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK