Implementing Custom Data Bindable Classes: CollectionBase
Subject:   Using objects with more than 1 property
Date:   2004-07-05 21:45:29
From:   dwfresh
This is a great article, however, if I had a products class with 10 properties, and wanted to allow a user to sort on any property, would I have to write 10 different 'AscendingNameSorter' type classes?
ie: AscendingTypeSorter, AscendingManufacturerSorter, etc.

private class AscendingNameSorter : IComparer
public int Compare(Object x, Object y)
Products.Product p1 = (Products.Product)x;
IComparable ic1 = (IComparable)p1.Name;

Products.Product p2 = (Products.Product)y;
IComparable ic2 = (IComparable)p2.Name;

return ic1.CompareTo(ic2);

So just write 10 different classes just like this one for each property.
I know there is a much better way, but would love to hear an answer from an expert!



Full Threads Oldest First

Showing messages 1 through 2 of 2.

  • Implementing sort for multiple properties
    2005-01-12 15:30:47  Daniel_Odulo [View]

    No you don't. The example below in in VB, you'll have to convert to C# yourself, sorry. But it's all straight forward.

    Public Enum SortOrder
    ID = 1
    Code = 2
    Description = 3
    Price = 4
    End Enum

    Public Enum SortDirection
    Ascending = 1
    Descending = 2
    End Enum

    Public Sub Sort(ByVal SortOrder As SortOrder, ByVal SortDirection As SortDirection)
    Dim Sorter As IComparer = New AscendingSorter(SortOrder, SortDirection)
    End Sub

    Private Class AscendingSorter
    Implements IComparer

    Private _SortOrder As SortOrder
    Private _SortDirection As SortDirection

    Public Sub New(ByVal SortOrder As SortOrder, ByVal SortDirection As SortDirection)
    _SortOrder = SortOrder
    _SortDirection = SortDirection
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
    Dim p1 As Product = CType(x, Product)
    Dim p2 As Product = CType(y, Product)

    Dim ic1 As IComparable, ic2 As IComparable

    Select Case _SortOrder
    Case SortOrder.Code
    ic1 = CType(p1.Code, IComparable)
    ic2 = CType(p2.Code, IComparable)
    Case SortOrder.Description
    ic1 = CType(p1.Description, IComparable)
    ic2 = CType(p2.Description, IComparable)
    Case SortOrder.ID
    ic1 = CType(p1.ID, IComparable)
    ic2 = CType(p2.ID, IComparable)
    Case SortOrder.Price
    ic1 = CType(p1.Price, IComparable)
    ic2 = CType(p2.Price, IComparable)
    End Select

    If _SortDirection = SortDirection.Ascending Then
    Return ic1.CompareTo(ic2)
    Return ic2.CompareTo(ic1)
    End If
    End Function
    End Class

    Daniel Odulo


    * Full Service Hosted E-Commerce Solution
    * Custom Data-Driven Solutions
    Desktop Applications / Web Applications / Web Enabling Data
    MS Access / MS SQL Server / ASP / VBScript / VBA / .NET

    I am located in: San Jose, California, USA
  • Using objects with more than 1 property
    2004-09-13 16:09:47  jamesstill [View]

    Doug, you do need to implement against IComparer for each sort property. Once that's done, I'd modify the Sort method accordingly:

    public void Sort(SortType eType)
    case SortType.Name:
    IComparer NameSorter = new _

    // next case etc.

    In this case, you'd have a public enum in the namespace defining the sort type options. Hope this helps.