I implement IComparable / IComparer for custom sorting but I need to keep some hierarchy.
My class :
public class Attribut : IComparable
{
public int ATT_ID { get; set; }
public string ATT_LIBELLE { get; set; }
public int ATT_PARENT_ID { get; set; }
}
The test data are as follows:
ATT_ID ATT_LIBELLE ATT_PARENT_ID
356 Avis client requis 0
357 Nom du destinataire client 356
358 Date d'envoi au client pour avis 356
366 CNPE ? 0
367 Palier 366
368 Tranche 366
369 Site 366
370 Materiel 366
371 Machine 366
372 Affaire parent 366
I would like sorting is done ascending / descending on ATT_LIBELLE but respecting the hierarchy.
FYI, under Oracle there is the clause Order By Siblings. There is no equivalent in C #?
Here is the desired result for ascending:
ATT_ID ATT_LIBELLE ATT_PARENT_ID
356 Avis client requis 0
358 Date d'envoi au client pour avis 356
357 Nom du destinataire client 356
366 CNPE ? 0
372 Affaire parent 366
371 Machine 366
370 Materiel 366
367 Palier 366
369 Site 366
368 Tranche 366
Here is the desired result for descending:
ATT_ID ATT_LIBELLE ATT_PARENT_ID
366 CNPE ? 0
368 Tranche 366
369 Site 366
367 Palier 366
370 Materiel 366
371 Machine 366
372 Affaire parent 366
356 Avis client requis 0
357 Nom du destinataire client 356
358 Date d'envoi au client pour avis 356
It's possible in C# ?
Thanks all!
EDIT :
Here is the code of the IComparable implementation :
public static IComparer sortAscending_ATT_LIBELLE { get { return new sortLibelleAscendingHelper(); } }
public static IComparer sortDescending_ATT_LIBELLE { get { return new sortLibelleDescendingHelper(); } }
private class sortLibelleAscendingHelper : IComparer
{
int IComparer.Compare(object a, object b)
{
var oAtta = (a as Attribut);
var oAttb = (b as Attribut);
if (a == null || b == null) { return 0; }
int ret = (oAtta.ATT_LIBELLE).CompareTo(oAttb.ATT_LIBELLE);
if ((oAtta.ATT_PARENT_ID != oAttb.ATT_PARENT_ID) || (oAtta.ATT_PARENT_ID == oAttb.ATT_ID))
{
ret = 1;
}
return ret;
}
}
private class sortLibelleDescendingHelper : IComparer
{
int IComparer.Compare(object a, object b)
{
var oAtta = (a as Attribut);
var oAttb = (b as Attribut);
if (a == null || b == null) { return 0; }
int ret = (oAttb.ATT_LIBELLE).CompareTo(oAtta.ATT_LIBELLE);
if ((oAtta.ATT_PARENT_ID != oAttb.ATT_PARENT_ID) || (oAtta.ATT_PARENT_ID == oAttb.ATT_ID))
{
ret = -1;
}
return ret;
}
}