#852 - Una classe Comparer per ordinare le collection con Generics

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));
  }
}

Nota: Questo script contiene un allegato.


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC