Sortowanie listy z własną strukturą

0

Witam serdecznie,

W jaki sposób mogę posortować listę, która zawiera moją strukturę? W strukturze mam przeciążone operatory:

  • <
  • ==
  • !=

Chciałbym użyć po prostu:
listaMoja.Sort();

Wiem, że istnieje OrederBy / ThenBy, jednak w celach naukowych chciałbym chciałbym się dowiedzieć, czy da się użyć tego zwykłego .Sort();

2

Wykorzystaj interfejs IComparable.

1

jak to mówią gimbusy teraz : "jprdl" - google nie istnieje ?

wpisałem c# custom list sort.
są trzy opcje, trudniejsza do zczajenia - na delegatach, implementująca interfejs ICompare i łatwiejsza na lambda

zakładam ze masz listę pracowników

class Pracownicy
{
  public int ID;
  public string Nazwisko;
  public string Imię;
}
list<pracownicy> lista;
 

to po prostu

lista.Sort( (Pracownik1,Pracownik2)=>Pracownik1.Nazwisko.CompareTo(Pracownik2.Nazwisko) );
 

lub jesli to są wartości liczbowe to na zwykłym lambda

 
lista.Sort((x, y) => y.ID - x.ID);
1

IComparable byłoby dobre, gdyby istniał jednoznaczny sposób porównania jednego obiektu z drugim.
Zwykle tak nie jest. Bo co to znaczy, że np. pracownik1 < pracownik2? według czego porównywać? nie wiadomo; można zdefiniować że wg nazwiska, wg ID, wg daty urodzenia… ale żaden z tych sposobów nie jest oczywisty.

Poza tym, w jednym miejscu możemy potrzebować sortowania według nazwiska, a w innym według płacy.
Dlatego lambda jest lepsza.

0

Panowie, może to i banał, ale nie mogę sobie poradzić z tym sortowaniem. Nieco inny przykład, ale idea ta sama. Chcę sortowanie po wielu kryteriach. Czytałem:
http://support.microsoft.com/kb/320727

Mój kod:

//domyślne po imieniu rosnąco
        int IComparable.CompareTo(object obj)
        {
            Osoba l = (Osoba)obj;
            return String.Compare(this.imie, l.imie);
        }

        //imię malejąco
        public static IComparer imieMalejaco()
        {
            return (IComparer)new SortujImieMalejaco();
        }

        //nazwisko rosnąco
        public static IComparer nazwiskoRosnaco()
        {
            return (IComparer)new SortujNazwiskoRosnaco();
        }

        //nazwisko malejąco
        public static IComparer nazwiskoMalejaco()
        {
            return (IComparer)new SortujNazwiskoMalejaco();
        }
private class SortujImieRosnaco : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                Osoba o1 = (Osoba)a;
                Osoba o2 = (Osoba)b;

                return string.Compare(o1.Imie, o2.Imie);
            }
        }

        private class SortujImieMalejaco : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                Osoba o1 = (Osoba)a;
                Osoba o2 = (Osoba)b;

                return string.Compare(o1.Imie, o2.Imie) * (-1);
            }
        }

        private class SortujNazwiskoRosnaco : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                Osoba o1 = (Osoba)a;
                Osoba o2 = (Osoba)b;

                return string.Compare(o1.Nazwisko, o2.Nazwisko);
            }
        }

        private class SortujNazwiskoMalejaco : IComparer
        {
            int IComparer.Compare(object a, object b)
            {
                Osoba o1 = (Osoba)a;
                Osoba o2 = (Osoba)b;

                return string.Compare(o1.Nazwisko, o2.Nazwisko) * (-1);
            }
        }

I kawałek kodu z innej klasy (gdzie istnieje lista Osób do posortowania)

public void Sortuj(metodySortowania metoda)
        {
            switch (metoda)
            {
                case metodySortowania.imieRosnaco :
                    listaOsob.Sort();
                    break;
                case metodySortowania.imieMalejaco :
                    listaOsob.Sort(Osoba.imieMalejaco(););
                    break;

Oczywiście błąd na tym:

listaOsob.Sort(Osoba.imieMalejaco());

Nie zgadza się argument... chociaż Osoba.imieMalejaco() zwraca IComparer a taki argument powinien być przyjęty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1