Una classe Comparer per ordinare le collection con Generics

di Stefano Mostarda, in ASP.NET 2.0,

Per riordinare gli elementi di una lista generica, ci si deve affidare al metodo Sort().
Quando si utilizzano tipi semplici (Int32, String, Boolean, etc) questo metodo è più che sufficiente, ma quando si utilizzano le classi non lo è più in quanto bisogna specificare in base a quale campo della classe riordinare. In questo caso si deve ricorrere all'utilizzo di un comparer, e tramite questo intervenire nel proceso di ordinamento.

Per creare un comparer generico, bisogna implementare l'interfaccia IComparer<T> e gestire il metodo Compare che viene invocato dal metodo sort quando deve effettuare il confronto tra 2 elementi.

using System;

public sealed class GenericComparer<T> : IComparer<T>
{

  private string _sortColumn;
  private ListSortDirection _sortDirection;

  public GenericComparer(string sortColumn, ListSortDirection sortDirection)
  {
    SortColumn = sortColumn;
    SortDirection = sortDirection;
  }

  public string SortColumn
  {
    get { return _sortColumn; }
    private set { _sortColumn = value; }
  }

  public ListSortDirection SortDirection
  {
    get { return _sortDirection; }
    set { _sortDirection = value; }
  }

  public int Compare(T x, T y)
  {
    PropertyInfo propertyInfo = typeof(T).GetProperty(SortColumn);
    IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
    IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
    if (SortDirection == ListSortDirection.Ascending)
      return (obj1.CompareTo(obj2));
    else
      return (obj2.CompareTo(obj1));
  }
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi